高分请教Linux下串口编程问题。只能发送数据,不能接收。

yang_dk 2008-10-07 05:41:32
症状如题,详细如下

返回值总是小于零。

主要代码如下
fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);

set_speed(fd,9600);
set_parity(fd,8,1,'N');
//这两个函数是参考了这里http://digilander.libero.it/robang/rubrica/serial.htm

n = write(fd,send,len);//没问题,对端可能正确接收
n = read(fd,recv,len); //这里返回的n值总是小于0,请指教

非常感谢!
...全文
605 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zztwart 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yang_dk 的回复:]
引用 16 楼 frank_ll 的回复:
估计是阻塞读写的问题
如果read读不到数据,那么他如果是O_NONBLOCK的,它会在没有读到数据的情况下反会-1 应该采用其他的方法来读写,例如I/O多路转接


一言提醒梦中人!
我以前就是这样接收到的,后来为了改进用了非阻塞。结果闹出这么多麻烦。

多谢!
[/Quote]说得具体点啊,多路转接是什么
yang_dk 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 frank_ll 的回复:]
估计是阻塞读写的问题
如果read读不到数据,那么他如果是O_NONBLOCK的,它会在没有读到数据的情况下反会-1
应该采用其他的方法来读写,例如I/O多路转接
[/Quote]

一言提醒梦中人!
我以前就是这样接收到的,后来为了改进用了非阻塞。结果闹出这么多麻烦。

多谢!
frank_ll 2008-10-11
  • 打赏
  • 举报
回复
估计是阻塞读写的问题
如果read读不到数据,那么他如果是O_NONBLOCK的,它会在没有读到数据的情况下反会-1
应该采用其他的方法来读写,例如I/O多路转接
Arthur_ 2008-10-10
  • 打赏
  • 举报
回复
用tcflush替换下

使用参考man tcflush
yang_dk 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 MYCHE 的回复:]
你看一下你发出去的指令对端是否正确收到.(用示波器抓来看一下,比比)
如果指令接收不正确,就会导致你所说的问题.
[/Quote]

发出去的指令对端能正确收到而且能解析并执行。
yang_dk 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Arthur_ 的回复:]
C/C++ codefd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);

set_speed(fd,9600);
set_parity(fd,8,1,'N');

n = write(fd,send,len);
lseek(fd, -n , SEEK_CUR); //reset fd
n = read(fd,recv,len);
[/Quote]

lseek不能对TTY设备进行操作
我尝试的结果是返回-1;
mycheche 2008-10-08
  • 打赏
  • 举报
回复
你看一下你发出去的指令对端是否正确收到.(用示波器抓来看一下,比比)
如果指令接收不正确,就会导致你所说的问题.
wudeshou82666 2008-10-08
  • 打赏
  • 举报
回复
希望上面的这些东西对你有用
wudeshou82666 2008-10-08
  • 打赏
  • 举报
回复
http://www.linuxdiyf.com/viewarticle.php?id=64739
wudeshou82666 2008-10-08
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20031223/10/2592945.html
yang_dk 2008-10-08
  • 打赏
  • 举报
回复
谢谢各位。晚上试试,解决了一定给各位再加分。

没错我是先发送再接收的,因为对端是被动的等待我发送的指令才会有返回。而且返回是固定的字节数!
我曾经使用两个线程一个收一个发,未果。然后使用最简单的先发送然后接收,先是不可以接收,后来曾经可以接收,第二天(没有改动程序)又不可以,很怪异,现在一直不可以。
Arthur_ 2008-10-07
  • 打赏
  • 举报
回复
fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY); 

set_speed(fd,9600);
set_parity(fd,8,1,'N');

n = write(fd,send,len);
lseek(fd, -n , SEEK_CUR); //reset fd
n = read(fd,recv,len);
Arthur_ 2008-10-07
  • 打赏
  • 举报
回复
fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY); 

set_speed(fd,9600);
set_parity(fd,8,1,'N');
//这两个函数是参考了这里http://digilander.libero.it/robang/rubrica/serial.htm

n = write(fd,send,len);//没问题,对端可能正确接收
lseek(fd, -n , SEEK_CUR); //n = read(fd,recv,len); //这里返回的n值总是小于0,请指教
Arthur_ 2008-10-07
  • 打赏
  • 举报
回复
我记得文件 在写的同时不能读 需要fseek下才能读,

这里应该类似。

lz可以去掉write看看是否能接收, 如果能 则可能是上述原因, 解决方法就是reset fd,

文件读写用fseek来恢复fp, 其它的 你man 下lseek或者fseek看看有没有参数支持描述伏的。
  • 打赏
  • 举报
回复
up星羽GG
星羽 2008-10-07
  • 打赏
  • 举报
回复
int _read(
int fd,
void *buffer,
unsigned int count
);


If fd is invalid, the file is not open for reading, or the file is locked, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, the function returns –1 and sets errno to EBADF
ysuliu 2008-10-07
  • 打赏
  • 举报
回复
是不是socket出问题了,帮顶~
yang_dk 2008-10-07
  • 打赏
  • 举报
回复
n = write(fd,send,len);//没问题,对端可能正确接收

可以正确接收

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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