Kri*_*ina 7 c linux serial-port tty
所以我有这个测试代码通过USB串口发送"HELLO":
int fd;
struct termios tty;
if((fd = open("/dev/ttyUSB0", O_WRONLY|O_NONBLOCK|O_NOCTTY)) == -1){
err(1, "Cannot open write on /dev/ttyUSB0");
}
tcgetattr(fd, &tty);
tty.c_iflag = 0;
tty.c_oflag = 0;
tty.c_lflag = 0;
tty.c_cflag = 0;
tty.c_cc[VMIN] = 0;
tty.c_cc[VTIME] = 0;
cfsetospeed(&tty, B19200);
cfsetispeed(&tty, B19200);
tty.c_cflag |= CREAD|CRTSCTS|HUPCL|CS8;
tcsetattr(fd, TCSANOW, &tty);
printf("Write: %i\n", write(fd, "HELLO", 5));
sleep(5);
if(close(fd) != 0){
warn("Could not close write fd");
}
Run Code Online (Sandbox Code Playgroud)
程序执行正常,"HELLO"被发送,但有一个问题.调用write()函数时似乎没有发送"HELLO",而是在文件描述符关闭时发送.我添加了上面的sleep(5)行来测试这个理论,果然,"HELLO"在程序执行后约5秒发送.如何在write()命令之后立即发送"HELLO"而不是close()?
该设备是一个tty设备,所以fsync不会有帮助,也许不会fflush.
默认情况下,设备在规范模式下工作,这意味着数据被打包成行单元.您可能会发现在数据中添加cr/lf对将导致它被发送.
您需要确保规范模式已关闭.此外,R的答案将是有用的.
http://en.wikibooks.org/wiki/Serial_Programming/termios
从手册页write():
从write()成功返回并不能保证数据已提交到磁盘.事实上,在一些错误的实现上,它甚至不能保证已成功为数据保留空间.唯一可以确定的方法是在完成所有数据写入后调用fsync(2).
您需要调用fsync()文件描述符以确保实际提交数据.
| 归档时间: |
|
| 查看次数: |
14161 次 |
| 最近记录: |