以100波特率处理串口

我正在查询是否可以从串口读取波特率为100的数据。 根据termio.h ,没有规定将100设置为波特率。 我在Linux上工作。 另一端的通信设备以100波特率发送数据,并且是固定的。 我想知道我的波特率是否设置为110,是否能保证我收到的数据是正确的? 或者有没有解决scheme?

请指导。

你真的很幸运 100波特是足够低,你可以计算出一个除数(1,152)与典型的16450兼容的串行端口(这几乎是所有的东西)和Linux 支持自定义除数与spd_cust参数setserial

嗯… 110 bps在串口速度中是独一无二的,因为它通常有两个停止位(所有其他速度都使用一个停止位),所以发送一个字符需要10位7位数据,或者11位8位位数据。

如果通信协议以每秒10个字符的速度通信,而某些对20世纪50年代协议无知的人可能会通过假设只有一个停止位和8位数据将cps转换为波特率,则可以得出结论为100波特的结论。

如果真正的100波特的自定义设置不起作用,请尝试设置标准的110波特率。

摘录自相关答案 :

 #include <errno.h> #include <termios.h> #include <unistd.h> int set_interface_attribs (int fd, int speed, int parity) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &tty) != 0) { error_message ("error %d from tcgetattr", errno); return -1; } cfsetospeed (&tty, speed); cfsetispeed (&tty, speed); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars if (speed == B110) tty.c_cflag |= CSTOPB; // 2 stop bits for 110 // disable IGNBRK for mismatched speed tests; otherwise receive break // as \000 chars tty.c_iflag &= ~IGNBRK; // ignore break signal tty.c_lflag = 0; // no signaling chars, no echo, // no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cc[VMIN] = 0; // read doesn't block tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls, // enable reading tty.c_cflag &= ~(PARENB | PARODD); // shut off parity tty.c_cflag |= parity; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CRTSCTS; if (tcsetattr (fd, TCSANOW, &tty) != 0) { error_message ("error %d from tcsetattr", errno); return -1; } return 0; } void set_blocking (int fd, int should_block) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &tty) != 0) { error_message ("error %d from tggetattr", errno); return; } tty.c_cc[VMIN] = should_block ? 1 : 0; tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout if (tcsetattr (fd, TCSANOW, &tty) != 0) error_message ("error %d setting term attributes", errno); } ... char *portname = "/dev/ttyUSB1" ... int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { error_message ("error %d opening %s: %s", errno, portname, strerror (errno)); return; } set_interface_attribs (fd, B110, 0); // set speed to 115,200 bps, 8n2 (no parity)