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