您好,我需要有关如何在程序中间正确更改UART端口的波特率的建议。

为了与所需的从站建立通信,我需要在UART上发送由13-26(MIN 11)LOW BITS组成的所谓的“中断字段”,因为我认为这不可能像之前和之后每8位UART添加开始和之后那样实现。停止位。我有一个想法,可以通过以9600Bauds和19200Baud的速度处理波特率发送中断字段来实现。
但是我看不到示波器的波特率之间的差异。所以我想我做错了。

#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <time.h>
#include <stdlib.h>


#define BAUDRATE9600 B9600
#define BAUDRATE19200 B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1
main()
{
int fd, c;
struct termios oldtio, newtio, midtio;


fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) { perror(PORT); exit(-1); }


tcgetattr(fd, &oldtio); /* save current port settings */


/* set new port settings for canonical input processing */
midtio.c_cflag = BAUDRATE9600 | CS8 | CLOCAL | CSTOPB ;
midtio.c_iflag = IGNPAR | ICRNL;
midtio.c_oflag = 0;
midtio.c_lflag = ICANON;

newtio.c_cflag = BAUDRATE19200 | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;


tcsetattr(fd, TCSANOW, &midtio);
char break[] = {0x00}; // break field (0000 0000)

c = write (fd, break, sizeof(break));

tcsetattr(fd, TCSANOW, &newtio);


char sync [] = {0x55};
char PID [] = {0xE2};
char data [] = {0xAA};
char data1 [] = {0xA5};
char check [] = {0xAF};
c = write (fd, sync, sizeof(sync));
c = write (fd, PID, sizeof(PID));
c = write (fd, data, sizeof(data));
c = write (fd, data1, sizeof(data1));
c = write (fd, check, sizeof(check));

/* restore old port settings */
 tcsetattr(fd,TCSANOW,&oldtio);
}

我也尝试过通过不同方式设置波特率的方法:
cfsetispeed(&midtio, B9600)
cfset0speed(&midtio, B9600)

cfsetispeed(&newtio, B19200)
cfset0speed(&newtio, B19200)

最佳答案



如果目标是发送“中断”,那么您已经问了一个“如何在c / c++中更改波特率”的XY问题。您无法通过操作波特率来产生中断条件。您需要低于32波特的波特率才能达到25分之二的间隔。

可以使用ioctl()中的 TCSBRK 命令在串行链接上发送中断条件。

顺便说一句,您的串行端口初始化代码不符合最佳编程习惯。您应该始终测试系统调用中的返回码。 termios结构的元素不应直接分配,而应仅修改单个位。请参考this之类的指南。

10-06 14:34