免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8392 | 回复: 13
打印 上一主题 下一主题

[应用] linux串口编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-01 16:53 |只看该作者 |倒序浏览
本帖最后由 ruchong001 于 2010-05-04 08:27 编辑

linux下一个串口写数据的问题
大家好,我在linux下编写这样一个程序,想通过ttyUBS0向另一个pc的串口发送数据,pc上用超级终端接受数据,设置为8,n,1,数据流控制为无,波特率设置为9600,但是不知道为什么运行了程序以后,在pc的超级终端
根本显示不到接收了数据。我认为是程序对ttyUSB0设置出了问题,但是不知道出在哪里,希望各位高手帮忙看下,程序代码很简单。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#define max_buffer_size 100 /*定义缓冲区最大宽度*/
/*******************************************/
int fd; /*定义设备文件描述符*/
int flag_close;
int open_serial(int k)
{
    if(k==0) /*串口选择*/
    {
fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY); /*读写方式打开串口*/
perror("open /dev/ttyUSB0");
    }
    else
    {
fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY);
perror("open /dev/ttyS1");
    }
    if(fd == -1) /*打开失败*/
return -1;
    else
return 0;
}
/********************************************************************/
int main(int argc, char *argv[ ] )
{
    char sbuf[]={"Hello,this is a Serial_Port test!"};
    int sfd,retv,i;
    struct termios options;
    int length=sizeof(sbuf);/*发送缓冲区数据宽度*/

    /*******************************************************************/
    open_serial(0); /*打开串口1*/
    /*******************************************************************/
    printf("ready for sending data...\n"); /*准备开始发送数据*/
    bzero(&options,sizeof(options));
    tcgetattr(fd,&options);
    //cfmakeraw(&options);
    /*****************************************************************/
    options.c_cflag|=CLOCAL|CREAD;
    options.c_cflag &= ~CSIZE;
    cfsetispeed(&options,B9600); /*波特率设置为9600bps*/
    cfsetospeed(&options,B9600);
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag |= CS8;
    options.c_cc[VMIN]=0;
    options.c_cc[VTIME]=0;
    /*******************************************************************/
    tcflush(fd,TCIFLUSH);
    tcsetattr(fd,TCSANOW,&options);
    retv=write(fd,sbuf,length); /*接收数据*/
    if(retv==-1)
    {
perror("write");
    }
    printf("the number of char sent is %d\n",retv);
    flag_close =close(fd);
    if(flag_close==-1) /*判断是否成功关闭文件*/
printf("Close the Device failur!\n");
    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2010-05-01 18:14 |只看该作者
教你个简单的测试方法

  1. cat /dev/ttyUSB0
复制代码
看看是不是有数据过来

这样就知道你的串口是不是真的收到数据了

按道理只要对方有数据过来,上面的命令就能够收到数,或者是乱码,但应该有

如果这样能收到数据,那再看看你的程序

论坛徽章:
0
3 [报告]
发表于 2010-05-03 22:06 |只看该作者
二楼,人家是读串口

我也遇到同样的问题,串口无法读数据,arm板上是RS485接口,在arm板上用write向ttyS0写数据时,pc机串口调试工具能收到数据,但通过pc机的串口调试工具向ttyS0发数据时,在arm板上无法读取ttyS0。

根据我分析原因是这样的:
#ps -ef
发现ttyS0服务已经被系统启动时一个服务占用了,系统启动时已经有服务不断的读取ttyS0,故当用程序read 串口时无论如何都读取不到数据,始终阻塞在read处。
第二种解释就是系统启动时ttyS0已经作为Console控制台终端而被占用,处于只写状态,console要不断的接受控制数据命令,在不断的读取ttyS0,因此,我们写的应用程序也读取不到数据。

我曾尝试,在网上找了一段代码,通过fcntl取消ttyS0作为console,但是还是无法用read读取ttyS0,一直阻塞在read处。

请各位高人指教。

论坛徽章:
0
4 [报告]
发表于 2010-05-04 06:12 |只看该作者
2楼的兄弟,如果用 cat 。。。的话,可能linux系统自身的设置与发送端的设置不同,也会收不到数据。

论坛徽章:
0
5 [报告]
发表于 2010-05-14 20:38 |只看该作者
2楼的兄弟,如果用 cat 。。。的话,可能linux系统自身的设置与发送端的设置不同,也会收不到数据。
ruchong001 发表于 2010-05-04 06:12



    那你就吧发送端设置成9600, 8N1试试看

只是给你思路,排除硬件问题

论坛徽章:
0
6 [报告]
发表于 2010-05-15 11:55 |只看该作者
二楼,人家是读串口

我也遇到同样的问题,串口无法读数据,arm板上是RS485接口,在arm板上用write向ttyS ...
dekee 发表于 2010-05-03 22:06


485是半双工,读写不能同时进行

看看下面这个文档,会有收获的

2. 嵌入式Linux串口编程的经典

论坛徽章:
0
7 [报告]
发表于 2010-05-17 00:05 |只看该作者
2. 嵌入式Linux串口编程的经典,这个资源介绍得很好,可以参考

论坛徽章:
0
8 [报告]
发表于 2010-05-17 21:26 |只看该作者
你open错了哇!不是dev/ttyusb0

论坛徽章:
0
9 [报告]
发表于 2010-05-17 21:49 |只看该作者
你设置的堵塞的方式 ?

options.c_cc[VMIN]=0;
options.c_cc[VTIME]=0;

???
{:3_182:}

论坛徽章:
0
10 [报告]
发表于 2010-05-18 09:44 |只看该作者
你open错了哇!不是dev/ttyusb0
techguan 发表于 2010-05-17 21:26



   
这是USB转串口的设备名
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP