2 qq 20835381 qq_20835381 于 2016.05.05 15:17 提问

linux串口编程实现自收自发功能发送可以发出去read读取总是返回-1

实现的功能就是串口的自收自发功能我用的事ch340 ch340的u口连接到笔记本上 ch340的串口端的rx 和tx用杜邦线连接在一起就是这样了但是现在问题是编译完成后发送可以发出去但是读取总是失败read返回值总是-1不知道哪里出错了求大神们解答下
小弟拜谢
#include
#include
#include
#include
#include

void set_speed(int, int);
int main()
{
int fd,flag,wr_num=0,rd_num=0;
struct termios term;
speed_t baud_rate_i,baud_rate_o;
char send_buf[]="hello,serial!",recv_buf[20];
fd=open("/dev/ttyUSB0",O_RDWR|O_NONBLOCK);
if(fd==-1)
printf("can not open the COM1!\n");
else
printf("open COM1 ok!\n");
flag=tcgetattr(fd,&term);
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("杈撳叆娉㈢壒鐜囨槸%d锛岃緭鍑烘尝鐗圭巼鏄?d锛屾枃浠舵弿杩扮鏄?d\n",baud_rate_i,baud_rate_o,fd);
set_speed(fd,9600);
flag=tcgetattr(fd,&term);
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("杈撳叆娉㈢壒鐜囨槸%d锛岃緭鍑烘尝鐗圭巼鏄?d锛屾枃浠舵弿杩扮鏄?d\n",baud_rate_i,baud_rate_o,fd);
while(1) { wr_num=write(fd,send_buf,sizeof(send_buf));/*鍏堝啓鍏?/
if(wr_num>0)
{
printf("write success!\n");
} else
{
printf("write fail!\n");
} sleep(1);
rd_num=read(fd,recv_buf,sizeof(recv_buf));/*鍐嶈鍑?/ if(rd_num>0)
{ printf("we can read \"%s\" from the COM1.total:%d characters\n",recv_buf,rd_num);
} else
{
printf("read fail!\n");
}

sleep(2); }
}

int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
19200, 9600, 4800, 2400, 1200, 300, };

void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{

tcflush(fd, TCIOFLUSH);

cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);

status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
{ perror("tcsetattr fd1");
return; }

tcflush(fd,TCIOFLUSH); }
}
}

1个回答

qq_20835381
qq_20835381   2016.05.05 17:13

别沉啊我靠 求助大家啊 真的很急的啊

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
linux uart 串口自发自收例程
linux 串口自环测试程序。两种不同的方法。select ,以及多线程方法。  select uart_sendrecv_notv.rar 点击(此处)折叠或打开 #include stdio.h>  #include stdlib.h>  #include unistd.h>  #include sys/types.h>  #i
Linux串口驱动分析read
/*串口read函数分析 * 当应用程序调用read系统调用时,会调用tty_fops中的tty_read * 接下来分析tty_read函数 * * 其中最重要的就是ld->ops->read(tty,file,buf,count); * 也就是调用线路规程中read函数 */ static ssize_t tty_read(struct file *file, char __user *bu
树莓派Linux串口编程实现自发自收
串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用。 Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口设备。在linux系统下面,每一个串口设备都有设备文件与其关联,设备文件位于系统的/dev目录下面。如linux下的/ttyS0,/ttyS1分别表示的是串口1和串
树莓派_Linux串口编程_实现自发自收
串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用。
串口自收自发
labview串口的程序编写,串口的自收自发适合初学者labview串口的程序编写,串口的自收自发适合初学者labview串口的程序编写,串口的自收自发适合初学者
linux 串口控制read()的说明
在数组c_cc中有两个下标(VTIME和VMIN)对应的元素不是控制符,并且只是在原始的模式下才有效。串口的模式控制是通过options.c_lflag控制的,如:options.c_lflag &=~ICANON设置串口为原始模式。在原始模式下,它们决定了read()函数在什么时候返 回。在标准的模式下,除非设置了非阻塞的模式(O_NONBLICK)选项,否则只有当遇到行结束符或者文件结束
linux 读取函数read
名字     read 从一个文件描述符中读取 概要     #include     ssize_t read(int fd, void *buf, size_t count); 描述     read() 尝试从文件描述符中读取多达count个字节到buf指向的缓冲里面。     如果count是0,read()返回0并没有其他的结果。如果count比SSIZE_MAX大,则结
linux多线程下打开串口发送和接收数据
1 启动线程1读串口 2 等待3秒后 3 启动线程2写串口,发送字符串后关闭 4 等待10秒 5 关闭两个线程   [c-sharp] view plaincopy #include    #include    #include    #include    #include   #include   #include  
好记性不如烂笔头(linux的串口超时read的参数意义)
在实际对串口设备操作时,一般都需要超时read,关于read的第三个参数意义总是忘记。 1:open /dev/ttySP0 获取fd 2:write(fd,***,)向fd写数据 3:fd返回响应数据,并使用select+read进行超时读取未知、不定长度的数据: read函数参数有三:int fd,char * p,int nbyte,前两个好理解,最后一个nb
ROS串口数据读取发送
包含串口数据HEX形式的读取,发送;读取后通过节点发送消息/* * myserialnode.cpp * */ #include &quot;ros/ros.h&quot; #include &amp;lt;serial/serial.h&amp;gt; #include &quot;crc.h&quot; #include &quot;global.h&quot; #include &amp;lt;std_msgs/String.h&amp;gt; #include &amp;lt;s...