[問題] rs232接/收問題請教

看板LinuxDev作者 (~我愛夏天~)時間13年前 (2012/11/10 11:36), 編輯推噓2(207)
留言9則, 4人參與, 最新討論串1/1
我想要在程式裡面實作 同時含有寫入與讀取的動作 但是不知道為什麼 如果寫入與讀取分開成兩隻程式,就可以跑 寫在一起反而就會卡住 因為我必須先送出資料給某機器(某機器使用rs232接到linux上) 某機器才會回傳資料給我 不曉得是否我的觀念有錯呢? 另外未來如果換成rs485的話 程式需要再去指定用rs485來傳輸呢? 還是說只要接好線就可以了呢? 謝謝 #define BAUDRATE B38400 #define MODEMDEVICE "/dev/ttyS0" int main() { int fd,c=0,res; struct termios oldtio, newtio; char buf[256]; fd=open(MODEMDEVICE, O_RDWR|O_NOCTTY|O_NDELAY); if(fd<0) { perror(MODEMDEVICE); exit(1); } fcntl(fd, F_SETFL, 0); printf("Open\n"); 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); printf("Read\n"); while(1) { write(fd,"test",4); //送資料給某機器 sleep(2); res=read(fd,buf,255); //接收某機器回傳的資料 buf[res]=0; printf("res=%d buf=%s\n",res,buf); //if(buf[0]=='/')break; } close(fd); tcsetattr(fd,TCSANOW,&oldtio); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 42.71.11.31

11/10 13:08, , 1F
先檢查 read 和 write 的 return value 對不對
11/10 13:08, 1F

11/10 13:18, , 2F
然後你所謂「卡住」究竟是卡在哪裡好歹也講一下吧
11/10 13:18, 2F

11/10 14:33, , 3F
不好意思,是會卡在 res=read(fd,buf,255)這地方
11/10 14:33, 3F

11/10 14:57, , 4F
RS485是半雙工,你的uart driver有支援嗎?
11/10 14:57, 4F

11/10 14:58, , 5F
一般的作法都是用一根GPIO去拉,收送之前先拉high/low
11/10 14:58, 5F

11/25 02:36, , 6F
res=read(fd,buf,255); 的下一行加個 perror("res");
11/25 02:36, 6F

11/25 02:38, , 7F
另外覺得在 buf[res]=0; 用 res 有點怪怪的
11/25 02:38, 7F

11/25 02:38, , 8F
用 buf[255]=0; 試試
11/25 02:38, 8F

11/26 20:06, , 9F
謝謝各位,問題已解嘍
11/26 20:06, 9F
文章代碼(AID): #1GdSkjtl (LinuxDev)
文章代碼(AID): #1GdSkjtl (LinuxDev)