我在设置串口参数时遇到了困难 在同一设备上运行良好的程序,留下以下stty输出:
$ stty -a -F /dev/ttyUSB0
speed 1200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 0; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl noflsh -xcase -tostop -echoprt -echoctl -echoke
我的尝试是这样的:
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~( ICANON | ECHO | ECHOE |ISIG );
options.c_iflag &= ~(IXON | IXOFF | IXANY );
options.c_iflag |= IGNBRK;
options.c_oflag |= ONLCR;
options.c_oflag &= ~(OCRNL|ONLRET|NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
tcsetattr(fd, TCSANOW, &options);
我已经尝试过设置B1200和B9600的速度但是没有用(手动说它应该是B9600)
这个选项有什么问题?
答案 0 :(得分:2)
stty
设置似乎是原始模式,而您的tcgetattr()
/ tcsetattr()
代码尝试使用非规范模式但输出不完整处理(OPOST未清除)
结果是串行端口处于半原始模式以进行输出。
尝试使用cfmakeraw()
设置非规范模式。
cfmakeraw()将终端设置为旧版本7终端驱动程序的“原始”模式:输入可逐字符显示,禁用回显,并禁用终端输入和输出字符的所有特殊处理。终端属性设置如下:
termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p->c_cflag &= ~(CSIZE | PARENB);
termios_p->c_cflag |= CS8;
有关工作示例代码,请参阅this 请注意,检查初始化期间系统调用的返回代码。
答案 1 :(得分:-2)
你应该试试
B115200
B57600
B38400
B19200
B9600
如果您不知道要设置哪个波特率,请逐一进行....