作者Milk1985 (David_Yu)
看板LinuxDev
标题[问题] Linux RS-232 程式设计
时间Mon Oct 17 21:23:42 2011
各位大大好,我想请问一下就是说
我现在要用RS-232来做一个资料的传送,
然而我预计要传送29笔资料出去,但是接收端却只能接收前8笔资料或前9笔资料,
之後的资料就都不见了,所以想请问这大概会是哪里有问题,谢谢!
收资料方面利用终端机收。
以下是我的传送端程式码
int fd,res=0;
struct termios oldtio,newtio;
int s1[29]= {0x01,0x10,0x17,0x70,0x0,0xa,0x14,0x0,0x81,0x0,0x81,0x0,
0x83,0x0,0x99,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0xff,0xff,
0xff,0xff,0xb3,0xdd};
char s2[29]={0};
fd = open (MODEMDEVICE, O_RDWR|O_NOCTTY);
tcgetattr (fd, &oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL |CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
for (int i=0;i<29;i++)
{
s2[i]=s1[i];
}
res=write(fd, s2 ,29);
tcsetattr(fd, TCSANOW, &oldtio);
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.124.182.35
1F:→ Milk1985:开发环境是使用QT撰写 10/17 21:38
2F:推 troylee:检查看看 write 回传的值 res 有没有全部送出去 (=29) 10/17 23:34
3F:→ Milk1985:我确定res值是29!!! 10/18 13:14
4F:推 eleghost:有close(fd)吗?是不是queue在buf内 10/18 22:04
5F:推 drag:最後一行的tcsetattr()要不拿掉,要不就改为TCSADRAIN或 10/19 14:21
6F:→ drag:TCSAFLUSH 试试看 10/19 14:21
7F:→ Milk1985:谢谢各位大大的帮忙! 我改成TCSAFLUSH 就解决问题了!!! 10/19 16:35
8F:推 drag:QT的话,有个很久没维护的Qextserial可以参考一下 10/19 18:48
9F:→ uranusjr:Qxt 也有类似的东西(QxtSerialDevice), 开发也比较积极 10/19 21:56
10F:→ uranusjr:不过如果没有跨平台需求, 直接用 Linux API 还比较快... 10/19 21:57
11F:→ uranusjr:配合 QSocketNotifier 就可以搞定了 10/19 21:57