看板 LinuxDev 關於我們 聯絡資訊
我想要在程式裡面實作 同時含有寫入與讀取的動作 但是不知道為什麼 如果寫入與讀取分開成兩隻程式,就可以跑 寫在一起反而就會卡住 因為我必須先送出資料給某機器(某機器使用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
uranusjr:先檢查 read 和 write 的 return value 對不對 11/10 13:08
uranusjr:然後你所謂「卡住」究竟是卡在哪裡好歹也講一下吧 11/10 13:18
blackspace98:不好意思,是會卡在 res=read(fd,buf,255)這地方 11/10 14:33
askacis:RS485是半雙工,你的uart driver有支援嗎? 11/10 14:57
askacis:一般的作法都是用一根GPIO去拉,收送之前先拉high/low 11/10 14:58
karamajean:res=read(fd,buf,255); 的下一行加個 perror("res"); 11/25 02:36
karamajean:另外覺得在 buf[res]=0; 用 res 有點怪怪的 11/25 02:38
karamajean:用 buf[255]=0; 試試 11/25 02:38
blackspace98:謝謝各位,問題已解嘍 11/26 20:06