作者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