[問題] Linux RS-232 程式設計

看板LinuxDev作者 (David_Yu)時間14年前 (2011/10/17 21:23), 編輯推噓4(407)
留言11則, 5人參與, 最新討論串1/1
各位大大好,我想請問一下就是說 我現在要用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

10/17 21:38, , 1F
開發環境是使用QT撰寫
10/17 21:38, 1F

10/17 23:34, , 2F
檢查看看 write 回傳的值 res 有沒有全部送出去 (=29)
10/17 23:34, 2F

10/18 13:14, , 3F
我確定res值是29!!!
10/18 13:14, 3F

10/18 22:04, , 4F
有close(fd)嗎?是不是queue在buf內
10/18 22:04, 4F

10/19 14:21, , 5F
最後一行的tcsetattr()要不拿掉,要不就改為TCSADRAIN或
10/19 14:21, 5F

10/19 14:21, , 6F
TCSAFLUSH 試試看
10/19 14:21, 6F

10/19 16:35, , 7F
謝謝各位大大的幫忙! 我改成TCSAFLUSH 就解決問題了!!!
10/19 16:35, 7F

10/19 18:48, , 8F
QT的話,有個很久沒維護的Qextserial可以參考一下
10/19 18:48, 8F

10/19 21:56, , 9F
Qxt 也有類似的東西(QxtSerialDevice), 開發也比較積極
10/19 21:56, 9F

10/19 21:57, , 10F
不過如果沒有跨平台需求, 直接用 Linux API 還比較快...
10/19 21:57, 10F

10/19 21:57, , 11F
配合 QSocketNotifier 就可以搞定了
10/19 21:57, 11F
文章代碼(AID): #1Ed2nWCT (LinuxDev)
文章代碼(AID): #1Ed2nWCT (LinuxDev)