当前位置:  技术问答>linux和unix

linux新手,请教各位大人串口通讯问题(发送十六进制正常,接受数据错误)附源码

    来源: 互联网  发布时间:2016-04-06

    本文导语:  在linux下做了个与dlt645电表通讯的串口程序,根据我发送的数据电表会反馈一陀十六进制的数据表示表的读数.现在用串口助手测了下发现发送的数据是正常的,接受的数据是错误的(接受数据已知).怀疑是串口初始化那里...

在linux下做了个与dlt645电表通讯的串口程序,根据我发送的数据电表会反馈一陀十六进制的数据表示表的读数.现在用串口助手测了下发现发送的数据是正常的,接受的数据是错误的(接受数据已知).怀疑是串口初始化那里的问题(9600,偶效验,8,1).请各位达人看看,小弟不胜感激.

#include 
#include 
#include       /*鏍囧噯杈撳叆杈撳嚭瀹氫箟*/
#include      /*鏍囧噯鍑芥暟搴撳畾涔?/
#include      /*Unix 鏍囧噯鍑芥暟瀹氫箟*/
#include   
#include    
#include       /*鏂囦欢鎺у埗瀹氫箟*/
#include     /*PPSIX 缁堢鎺у埗瀹氫箟*/
#include       /*閿欒鍙峰畾涔?/
#include 

#define BUFFLEN 1024 /*瀹氫箟缂撳啿鍖哄ぇ灏?/
unsigned char Buffer[BUFFLEN]; /*瀹氫箟缂撳啿鍖?/
unsigned char ReBuffer[BUFFLEN]={''}; /*瀹氫箟缂撳啿鍖?/
int fd;   /*device description*/
int flag_close;

/*--------------------------------------------------------------------------------------------------------------*/
void InitCOM() /*PC鏈?32涓插彛鍒濆鍖栵紝璁剧疆娉㈢壒鐜囧拰缂撳啿鍖猴紝鐒跺悗鎵撳紑涓插彛寮€濮嬮€氳*/ 
{   
    int sfd,retv,i;
    struct termios option;

    fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY);
    if (-1 == fd)
     { 
         /* 涓嶈兘鎵撳紑涓插彛涓€*/ 
       printf(" open/dev/ttyS0 閿欒锛?);
     }
    tcgetattr(fd,&option);//tcgetattr鍑芥暟鐢ㄤ簬鑾峰彇涓庣粓绔浉鍏崇殑鍙傛暟銆傚弬鏁癴d涓虹粓绔殑鏂囦欢鎻忚堪绗︼紝杩斿洖鐨勭粨鏋滀繚瀛樺湪termios缁撴瀯浣撲腑

        bzero( &option, sizeof( option ) );
option.c_cflag  |=  CLOCAL | CREAD; 
option.c_cflag &= ~CSIZE; 


    cfmakeraw(&option);//璁剧疆缁堢鐨?Raw 妯″紡,濡傛灉涓嶆槸寮€鍙戠粓绔箣绫荤殑锛屽彧鏄覆鍙d紶杈撴暟鎹紝鑰屼笉闇€瑕佷覆鍙f潵澶勭悊锛岄偅涔堜娇鐢ㄥ師濮嬫ā寮?Raw Mode)鏂瑰紡鏉ラ€氳浣跨敤鏂囦欢鎿嶄綔read鍑芥暟璇诲彇锛?     /*******************************************************/
    cfsetispeed(&option,B9600);    /*baud 9600*/
    cfsetospeed(&option,B9600);
     /*******************************************************/偶
              option.c_iflag |= (INPCK | ISTRIP);
option.c_cflag |= PARENB;
option.c_cflag &= ~PARODD;
              //8位
              option.c_cflag |= CS8;
              //1位停止位
              option.c_cflag &=  ~CSTOPB;
             option.c_cflag |=  CSTOPB;

      option.c_cc[VTIME]  = 150;
      option.c_cc[VMIN] = 0;
      tcflush(fd,TCIFLUSH);

    tcsetattr(fd,TCSANOW,&option);//tcsetattr鍑芥暟鐢ㄤ簬璁剧疆缁堢鐨勭浉鍏冲弬鏁般€傚弬鏁癴d涓烘墦寮€鐨勭粓绔枃浠舵弿杩扮锛屽弬鏁?
}

/*--------------------------------------------------------------------------------------------------------------*/
void send(char *result_p)
{
    int j;
    unsigned short i_crc;
    unsigned char *src_buf;
    src_buf = Buffer;
     
       Buffer[0]=0xfe;
       Buffer[1]=0xfe;
       Buffer[2]=0xfe;
       Buffer[3]=0xfe;
       Buffer[4]=0x68;
       Buffer[5]=0x99;
       Buffer[6]=0x99;
       Buffer[7]=0x99;
       Buffer[8]=0x99;
       Buffer[9]=0x99;
       Buffer[10]=0x99;
       Buffer[11]=0x68;
       Buffer[12]=0x01;
       Buffer[13]=0x02;
       Buffer[14]=0x43;
       Buffer[15]=0xc3;
       Buffer[16]=0x6f;
       Buffer[17]=0x16;

    j = write(fd,Buffer,18);
    if (j == -1)
     {
       printf("write operation is error!");
     }
     
}
/*--------------------------------------------------------------------------------------------------------------*/
void receive(void)
{
    printf("read.....n");
    unsigned char *rbuf; //it si must be a unsigned , because unsigned char --> char = sign cause ffffff
    rbuf=ReBuffer;
    while(1)
    {    
       int retv=read(fd,rbuf,1);
       if(retv!=-1)
       {
           printf("%xn",*rbuf);
       }
       else
       {
           printf("can not read data! ");
       } 
  
       rbuf++;

    }
}
/*--------------------------------------------------------------------------------------------------------------*/
int main()

    InitCOM();
    printf("InitCOM is OK!n");

    //read thread
    pthread_t id;
    int ret=0;
    ret=pthread_create(&id,NULL,(void *)receive,NULL);
    if(ret!=0){
      printf ("Create pthread error!n");
      return -1;
    }    

    send(result);
    printf("send is OK!n");
    
    printf("receive the date:n");
    sleep(9);//多线程
     
    int flag_close =close(fd);
    if (flag_close==-1)   /* whether sucess to close file*/
    printf("Close the Device failur!n");
    printf("Close the Device!n");
    return 0;
}


直接拷贝过来的,所以可以直接跑


|
你接收数据错误是啥错误 ?

是不是有些特殊字符收不到 ? 如果是:
加入红色部分代码.


options.c_cc[VTIME] = 150; // 15 seconds
options.c_cc[VMIN] = 0;

options.c_cflag |= CLOCAL | CREAD;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST; 
options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

        tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */

|
建议你看下《精通Unix下C语言编程与项目实践》的第8章《设备文件》的第8.4.1小节《操作连接串口的外设》,上面有详细的解释,这里是上面的一个打开串口程序供参考,你可以直接使用。另外你说接收的信息是错误的,是指什么意思,是返回-1,还是正确返回,当时内容错误?
代码8-3 打开设备文件函数(节自/code/chapter8/term2.c)
int OpenTTY(char *devname)
{
| int fd;
| if((fd=open(devname,O_RDWR))==-1)
| { 
| fprintf(stderr, "打开终端[%s]出错!", devname); 
| return(-1);
| }
| if((ioctl(fd, TCGETA, &oldtty))==-1)
| {
| fprintf(stderr, "取终端[%s]参数出错!", devname); 
| close(fd); 
| return(-1);
| }
| newtty=oldtty;
| newtty.c_iflag &= ~ICRNL;
| newtty.c_oflag = newtty.c_oflag & ~ONLCR & TAB0 | OPOST;
| newtty.c_lflag = newtty.c_lflag & ~ICANON & ~ECHO;
| newtty.c_cflag |= B9600;
| newtty.c_cc[VMIN]=1;
| newtty.c_cc[VQUIT]=0;
| if((ioctl(fd, TCSETA, &newtty)) == -1) 
| { 
| fprintf(stderr, "设置终端[%s]参数出错!", devname);
| close(fd); 
| return(-1);
| }
| return(fd);
}


——————————————————————————————
《精通Unix下C语言编程与项目实践》(http://book.educity.cn/viewbook.asp?id=87 ),
本书以实际应用为目标,直接讲述在产生中最有可能知识,并提供可直接使用的应用编程模板,对初学者尤其有帮助。

|
设置的时候不定看errno的值!

    
 
 

您可能感兴趣的文章:

  • 100分求linux下串口调试工具,要可以发送、接收十六进制
  • 如何在linux下调试串口,发送十六进制数据?
  • Linux下C语言怎样从键盘读入一个十六进制字符数组
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • 编程语言 iis7站长之家
  • Linux 中用java语言写串口程序,提示找不到串口
  • 高分求助:我笔记本没有串口,在linux下要和一个串口设备连,怎么办?
  • 关于linux串口通信中写串口的问题
  • 在虚拟Linux系统下能进行串口通讯吗?最好给个串口通讯的代码!谢谢!
  • linux下串口发送数据用串口精灵接受不到或为全零
  • 嵌入式linux,串口初始化时,无法设置串口属性
  • linux串口驱动该怎么写
  • linux下如何清空串口的输入输出缓存
  • linux下怎么监控串口?
  • vmware 上 linux 串口问题
  • linux下串口通信的问题
  • linux下的串口编程比较熟悉,麻烦帮忙!
  • 在线等待,求助LINUX下串口问题
  • 请教一个linux串口通讯问题?
  • linux 串口打印
  • 请问,那位高手研究过linux下的串口驱动程序?
  • 问一个LINUX下串口的问题
  • 如何在linux上使用串口设备
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux/centos源码安装nginx编译配置选项参数介绍
  • 大家好,我有从网上下的BT源码和MPLAYER源码(是LINUX源码安装的)我想分析一下这些源码。可是这些源码有工作区么?
  • linux/centos下安装nginx(rpm安装和源码安装)详细步骤
  • 请问,shell的一些命令的源码在linux源码树中的那部分?
  • 搜索引擎蜘蛛源码,谁能帮我编译一下!!!源码相赠(没办法,我了解Linux!!!)
  • 都说Linux是开源的,在哪可以找到Linux的源码?
  • 书写基于Linux内核的键盘记录器(Writing Linux Kernel Keylogger)中的源码如何编译通过???
  • linux下命令应用软件的源码放在那里?
  • 关于Linux中的QoS部分源码分析
  • 求Linux下mplay(或其它播放器)源码
  • 如何学习linux命令源码
  • 哪本linux源码分析的书里详细讲解了Linux的核心启动代码
  • 咨询一下linux 源码的发布方式
  • 有没有玩的转LINUX源码的高手?
  • Linux字符模式下,有没有支持源码关键字的软件?
  • 请教:如何阅读linux下的源码
  • 可有人对linux的dhcp的源码分析过么?望各位指教,
  • Linux Device Driver 源码请教
  • linux命令源码阅读--求指点
  • 急求Linux下的rtsp服务器的源码?
  • Linux0.11 内核源码 main函数的参数问题
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3