当前位置: 技术问答>linux和unix
【紧急求助】串口自发自收的问题
来源: 互联网 发布时间:2016-02-28
本文导语: #define SleepMs( ms ) ( usleep( (ms)*1000 ) ) //打开串口 int OpenDev(char *Dev) { int fd = open( Dev, O_RDWR ¦ O_NOCTTY ...
#define SleepMs( ms ) ( usleep( (ms)*1000 ) )
//打开串口
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ¦ O_NOCTTY ¦ O_NDELAY);
if (fd==-1)
{
perror( "Can 't Open Serial Port ");
}
else
{
fcntl(fd, F_SETFL,FNDELAY);
}
return fd;
}
int main()
{
int comfd = OpenDev( "/dev/ttyS0 " );
char srcBuf[] = "12345 ";
while( 1 )
{
int writeLen = write( comfd, srcBuf, sizeof(srcBuf) ); //S0发送
char tmpRecvBuf[16];
//接收
for( int i = 0; i 0 )
{
printf( "okn " );
break;
}
SleepMs( 1 );
}
SleepMs( 1000 );
}
return 0;
}
//以上是串口自发自收的测试程序,将串口2,3脚短接,但是没有打印 "ok ",即没有收到数据;而发送是成功的(writeLen的值大于0)。
请问这是什么原因?
P。S。因为是同一个串口,所以没有设置波特率等参数;另外串口用“串口调试助手”测试是正常的,能够自发自收数据。
//打开串口
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ¦ O_NOCTTY ¦ O_NDELAY);
if (fd==-1)
{
perror( "Can 't Open Serial Port ");
}
else
{
fcntl(fd, F_SETFL,FNDELAY);
}
return fd;
}
int main()
{
int comfd = OpenDev( "/dev/ttyS0 " );
char srcBuf[] = "12345 ";
while( 1 )
{
int writeLen = write( comfd, srcBuf, sizeof(srcBuf) ); //S0发送
char tmpRecvBuf[16];
//接收
for( int i = 0; i 0 )
{
printf( "okn " );
break;
}
SleepMs( 1 );
}
SleepMs( 1000 );
}
return 0;
}
//以上是串口自发自收的测试程序,将串口2,3脚短接,但是没有打印 "ok ",即没有收到数据;而发送是成功的(writeLen的值大于0)。
请问这是什么原因?
P。S。因为是同一个串口,所以没有设置波特率等参数;另外串口用“串口调试助手”测试是正常的,能够自发自收数据。
|
原始模式这样设置
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //输入
options.c_oflag &= ~OPOST; //输出
|
要不, 你起个线程,
主线程发, 后台线程收。
再试试。
主线程发, 后台线程收。
再试试。
|
应该 设置成败原始模式,否则在LINUX/UNIX下,被终端处理程序接收了,只有完整1行才返回!!
|
波特率这些东西最好还是设置一下,何必偷那点懒。
现成的代码, copy一份试试就行。
http://www.ibm.com/developerworks/cn/linux/l-serials/index.html
现成的代码, copy一份试试就行。
http://www.ibm.com/developerworks/cn/linux/l-serials/index.html
|
串口发送和接收之间是有一定的间隔的。试一下在发送和接收间加一段延时吧。
|
没问题,应该是你短接2,3短接错了,你可能把3,4短接了,调一下就可以了.