Linux下读串口数据,read()返回“Input/Output error”

Sherlock_c787 2018-09-21 02:58:40
如题,本人想用串口读外设的数据,文件fd获取没问题,调研read()函数,返回值为-1,打印错误发现是“Input/Output error”。
找了一些方法,但不奏效,求问各位前辈这种情况如何解决!
以下是源代码


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>

#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttyS3"

int main()
{
int fd,c=0,res,i;// i 是循环变量
struct termios oldtio,newtio;
char buf[256];
printf("start ...\n");
fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY); // 打开pc的com2端口
if(fd<0)
{
printf("flag1 ...\n");
perror(MODEMDEVICE);
printf("flag2...\n");
exit(1);
}
printf("open...\n");

tcgetattr(fd,&oldtio);//将目前终端机参数保存至oldtio
bzero(&newtio,sizeof(newtio));//清楚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);//新的term iOS作为通信端口参数
printf("reading...\n");

//while(1)
//{
res = read(fd,buf,80);
printf("res=%d\n",res); //查看res返回值
perror("read:\n"); //打印错误信息
buf[res] = '\0';
for(i=0;i<res;i++)
{
printf("num %d ,the data is %d\n",i,buf[i]);
}

//}
printf("colse...\n");
close(fd);
tcsetattr(fd,TCSANOW,&oldtio);//恢复旧端口参数
return 0;
}


运行结果如下所示(图片传不上去)

start ...
open ...
reading ...
read: Input/output error
close...


提前谢谢各位前辈
...全文
2707 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sherlock_c787 2018-11-30
  • 打赏
  • 举报
回复
是那个系统的问题,原来是16.04,换回ubutu14.04就可以了。
我用的是firefly的rk3288,系统是店家提供的。
e1212dison 2018-11-07
  • 打赏
  • 举报
回复
root用户?
agpintel 2018-09-26
  • 打赏
  • 举报
回复
bzero(&newtio,sizeof(newtio)); newtio.c_cflag |= CS8|CLOCAL|CREAD; newtio.c_cflag &= ~PARENB; cfsetispeed(&newtio, B115200); cfsetospeed(&newtio, B115200); newtio.c_cflag &= ~CSTOPB; newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 0; tcflush(fd,TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio);
agpintel 2018-09-26
  • 打赏
  • 举报
回复
Input/output error 应该是 #define MODEMDEVICE "/dev/ttyS3" 没有设好对应的串口, 如果com2应该是 /dev/ttyS1 但是还是发送接收不成功, 我把串口配置改成下面就可以了. 我也是刚了解串口, 简单的收发没有问题, cflag的具体细节了解不深. bzero(&newtio,sizeof(newtio)); newtio.c_cflag |= CS8|CLOCAL|CREAD; newtio.c_cflag &= ~PARENB; cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); newtio.c_cflag &= ~CSTOPB; newtio.c_cc[VTIME] = 0; tcflush(fd,TCIFLUSH);

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧