最近刚刚开始接触Linux内核编程,第一项就是串口编程,结果卡在这里了,卡了好久,后来发现问题其实挺简单的,只是没有想到,现在把代码放在下面,代码内有详细的注释,就不多做说明了,而我当时出问题的地方我也做了特殊说明,希望你们注意一下(实验环境是microwrt)

/**按照教程学习串口的编程*网址1:http://blog.csdn.net/shanzhizi/article/details/9241393*网址2:http://blog.csdn.net/shui1025701856/article/details/7571686*网址3:http://wenku.baidu.com/link?url=TsZc-rSDq_8ayNdWXYzkJRHLEowtx7OQMiFj_BH4M3VfvDrw4hU785aIciwS1xAmViJmz6pN0ety1_Zv8-AM2OAflOB3-UiMu9RvcSQKrAG*/
//头文件
#include <stdio.h>    //标准输入输出定义
#include <stdlib.h>   //标准函数库定义
#include <unistd.h>   //Unix标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>    //文件控制定义
#include <termios.h>  //POSIX中断控制定义
#include <errno.h>    //错误号定义
#include <string.h>#define serial_device "/dev/ttyS1"
//打开串口
int open_port(void)
{int fd;        //串口的标识符//O_NOCTTY用来告诉Linux这个程序不会成为“控制终端”//O_NDELAY用来告诉Linux这个程序不关心DCD信号fd=open(serial_device,O_RDWR | O_NOCTTY | O_NDELAY);if(fd == -1){//不能打开串口perror("open_port: Unable to open /dev/ttyS0 -");return(fd);}else{fcntl(fd, F_SETFL, 0);printf("open ttys1 .....\n");return(fd);}
}//设置波特率
void set_speed_and_parity(int fd, int speed)
{int i=0;      //设置循环标志——注意不要在for内设置,否则会出错struct termios Opt;   //定义termios结构if(tcgetattr(fd,&Opt)!=0){perror("tcgetattr fd");return;}tcflush(fd, TCIOFLUSH);cfsetispeed(&Opt, speed);cfsetospeed(&Opt, speed);/*tcsetattr函数标志:TCSANOW:立即执行而不等待数据发送或者接受完成。TCSADRAIN:等待所有数据传递完成后执行。TCSAFLUSH:Flush input and output buffers and make the change*/if(tcsetattr(fd, TCSANOW, &Opt) != 0){  perror("tcsetattr fd");return;}tcflush(fd, TCIOFLUSH);//设置奇偶校验——默认8个数据位、没有校验位Opt.c_cflag &= ~PARENB;Opt.c_cflag &= ~CSTOPB;Opt.c_cflag &= ~CSIZE;Opt.c_cflag |= CS8;//其他的一些配置//原始输入,输入字符只是被原封不动的接收Opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//软件流控制无效,因为硬件没有硬件流控制,所以就不需要管了Opt.c_iflag &= ~(IXON | IXOFF | IXANY);//原始输出方式可以通过在c_oflag中重置OPOST选项来选择:Opt.c_oflag |= ~OPOST;//VMIN可以指定读取的最小字符数。如果它被设置为0,那么VTIME值则会指定每个字符读取的等待时间。Opt.c_cc[VTIME] = 0;Opt.c_cc[VMIN] = 0;
//       Opt.c_cflag &= ~INPCK;
//      Opt.c_cflag |= (CLOCAL | CREAD);
//
//      Opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
//
//      Opt.c_oflag &= ~OPOST;Opt.c_oflag &= ~(ONLCR | OCRNL);
//Opt.c_iflag &= ~(ICRNL | INLCR);
//      Opt.c_iflag &= ~(IXON | IXOFF | IXANY);
//
//      Opt.c_cc[VTIME] = 0;
//      Opt.c_cc[VMIN] = 0;tcflush(fd, TCIOFLUSH);}/***串口发送数据函数*fd:串口描述符*data:待发送数据*datalen:数据长度*/
int serial_write(int fd ,char *data, int datalen)
{int len=0;//获取实际传输数据的长度len=write(fd,data,datalen);printf("send data OK! datalen=%d\n",len);return len;
}/** *串口接收数据 *要求启动后,在pc端发送ascii文件 */
int serial_read(int fd,char buff[],int datalen)
{int nread=0;printf("Ready for receiving data...");nread=read(fd,buff,datalen);if(nread>0){printf("readlength=%d\n",nread);buff[nread]='\0';printf("%s\n",buff);}return nread;
}int serialport()
{int fd;    //打开串口if((fd=open_port())<0){perror("open_port error");return 0;}//设置波特率和校验位set_speed_and_parity(fd,115200);return (fd);
}int main(void)
{int fd;int nread,i,n =0,datalen=255, len = 0;char testbuff[]="Hello\r\n";char readbuff[256];fd=serialport();printf("fd=%d\n",fd);//尝试先写内容nread=write(fd,testbuff,datalen);if(nread==-1){printf("write bad\n");}else{printf("the test is ok!\n");} //循环读取串口并输出while(1){printf("enter the while loop\n");//这个是重点,当时我就是这个问题出错了,每次读之前必须清空一次。bzero(readbuff, sizeof(readbuff));datalen=serial_read(fd,readbuff,512);if(datalen > 0){if(readbuff[0]=='O'&&readbuff[1]=='F'&&readbuff[2]=='F'){break;}serial_write(fd,readbuff,datalen);}}
}

这个程序的目的是实现先输出测试内容,然后读取串口内容并输出出去。测试可用,如果不能用请提出,我进一步修正或答疑解惑。。

谢谢关注。。。

OPENWRT串口收发测试详解相关推荐

  1. 陶晶驰stm32_陶晶驰HMI3.5寸串口屏的详解之梳理F4总结系列准备篇(二)

    基于stm32的串口屏教程.用过的人都说好,哈哈哈,减少了我们很多不太必要的麻烦步骤. 程序资料包CSDN下载地址:https://download.csdn.net/download/qq_3835 ...

  2. mysql ssd 性能测试 写入_MySQL服务器的SSD性能问题分析和测试详解

    [问题] 我们有台HP的服务器,SSD在写IOPS约5000时,%util达到80%以上,那么这块SSD的性能究竟有没有问题,为解决这个问题做了下面测试. [工具] blktrace是linux下用来 ...

  3. batchnorm2d参数 torch_pytorch方法测试详解——归一化(BatchNorm2d)

    测试代码: import torch import torch.nn as nn m = nn.BatchNorm2d(2,affine=True) #权重w和偏重将被使用 input = torch ...

  4. Nmap渗透测试详解(一)

    Nmap渗透测试详解(一) 如今,Nmap享有"扫描之王"盛誉. Nmap诞生于1996年.在这个信息爆炸的互联网时代,Nmap依然保持着充沛的活力以及旺盛的生命力.原因如下: 知 ...

  5. 逆变效率软件测试,【干货】光伏逆变器动态MPPT效率测试详解

    原标题:[干货]光伏逆变器动态MPPT效率测试详解 在现实生活中,由于阳光照射角度.云层.阴影等多种因素影响,光伏阵列接受到的阳光辐照度和相应温度在不同的条件下会有很大的差别,比如在早晨和中午,在 晴 ...

  6. 计算机场地规范中光纤链路测试,光纤链路测试详解.doc

    光纤链路测试详解 ?随着光纤通信技术的快速发展,基于FTTH的宽带网络必将成为光纤通信中一个新的热点.光纤是迄今为止最好的传输媒介,光纤接入技术与其他接入技术(如铜双绞线.同轴电缆)相比,最大优势在于 ...

  7. ws2812b程序51单片机_51单片机串口通信程序详解

    串口通信简介 串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串行接口电路 ...

  8. fpu测试_I510400性能及温度测试详解

    5月20号,INTEL将正式销售十代民用桌面级处理器,此次上市的型号相对9代与8代来说要多了很多型号,仅I9系列就有4个型号,下图有此次INTEL更新所有型号的参数: 从上图参数可知,Intel有史以 ...

  9. 自动化测试框架[Cypress命令行执行测试详解]

    前提 已经熟练掌握了Cypress的基本知识,请参考自动化测试框架[Cypress概述]和自动化测试框架[各自动化测试框架比较] 已经熟练掌握Cypress环境配置,请参考自动化测试框架[Cypres ...

最新文章

  1. Xilinx FPGA全局时钟和第二全局时钟资源的使用方法
  2. javax.websocket.DeploymentException: The path [webScoketServiceBaidu/{appID}] is not valid.
  3. Subversion 1.7 Eclipse integration in Ubuntu12(转载)
  4. tcpdump -i eth0 -n -vvv src or dst port 443
  5. 磁盘里竟然还有这个东西!多亏这个1.5M大小的神器工具发现了它
  6. 音视频技术开发周刊 63期
  7. 15行代码AC——习题3-3 数数字 (UVa1225,Digit Counting)
  8. 正确地启动hadoop
  9. (五)门级电路低功耗设计优化
  10. LeetCode 379. 电话目录管理系统(哈希set)
  11. 信息学奥赛C++语言:推销产品
  12. 百度SEO站群织梦响应式博客资讯网模板
  13. android 控件监听方法是,Android | Android中监听Button的实现
  14. IE9 RC【离线安装包】!终于等到了!
  15. 让你轻松驾驭分布式系统设计-阿里P8纯手工打造架构师修炼手册
  16. AFD-0654: AFD is not supported on Exadata systems CRS-10001: Errors xxx.ko was not found
  17. REmap发布,用R绘制百度迁徙图
  18. Halo博客 -- ③ 本地运行
  19. 三体计算机原理,“三体”你必须知道的4个理论
  20. 安卓手机怎么设置蓝牙耳机弹窗动画_链接2020.3.3其他团无线蓝牙耳机

热门文章

  1. 立体视觉–stereo correspondence(双目立体匹配)
  2. 排序算法——十大排序算法的图示与实现
  3. python发送邮件并返回提示_python-邮件提醒功能
  4. 专业的在线ps照片处理网页源码
  5. 简洁精美的图片在线压缩网站html源码
  6. linux服务器定时关机重启,Ubuntu Server 10.10 每天定时开关机linux服务器应用 -电脑资料...
  7. 文档安全管理系统服务器地址是什么,一种文档安全管理系统登录方法及装置
  8. 我的世界linux服务器乱码,我的世界服务器控制台使用上箭头乱码解决办法
  9. 二、Linxu的目录结构
  10. 亲测无限坐席在线客服系统源码