1

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

为了与我想要的从机建立通信,我需要在 UART 上发送所谓的“中断字段”,它由 13-26(MIN 11)低位组成,因为我认为在每 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)
4

1 回答 1

2

我需要发送所谓的“中断字段”

如果目标是发送“中断”,那么您已经问了一个 XY 问题,即“如何更改 c/c++ 中的波特率”。您不能通过操纵波特率来生成中断条件。您需要低于 32 波特的波特率才能实现 1/4 秒的中断。

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

顺便说一句,您的串行端口初始化代码不符合最佳编程实践。您应该始终测试系统调用的返回码。不应直接分配termios结构的元素,而应仅修改各个位。请参阅这样的指南

于 2014-01-29T18:26:45.233 回答