本例程可实现自定波特率,发送次数,发送间隔,发送字符串,同时接收数据保存文件的功能.
代码如下

#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
#include <pthread.h>
#include <getopt.h>
#include <time.h>#define msleep(n) usleep(n * 1000)#define NONE "\033[m"
#define RED "\033[0;32;31m"
#define LIGHT_RED "\033[1;31m"
#define GREEN "\033[0;32;32m"
#define LIGHT_GREEN "\033[1;32m"
#define BLUE "\033[0;32;34m"
#define LIGHT_BLUE "\033[1;34m"
#define DARY_GRAY "\033[1;30m"
#define CYAN "\033[0;36m"
#define LIGHT_CYAN "\033[1;36m"
#define PURPLE "\033[0;35m"
#define LIGHT_PURPLE "\033[1;35m"
#define BROWN "\033[0;33m"
#define YELLOW "\033[1;33m"
#define LIGHT_GRAY "\033[0;37m"
#define WHITE "\033[1;37m"volatile int fd;
fd_set rd;
char *dev = NULL;
char *baudrate = "115200";
char *buffer = "Welcome to linux ";
static int sleeptime = 1000;
int count = 10;
int send_forever = 0;
char msg[512];
int nread, retval;
unsigned long recvTotal = 0;
volatile int sendnum = 1, recenum = 1;pthread_mutex_t mut;  volatile pthread_t thread[2];
volatile const int READ_THREAD_ID = 0;
volatile const int SEND_THREAD_ID = 1;
volatile int COM_READ_STATU = 1;
volatile int COM_SEND_STATU = 1;        struct timeval timeout = {0, 100};   static void print_usage(const char *pname)
{printf("Usage: %s -d devname -b baudrate -s string -t time -c count""\nExample : %s -d /dev/ttymxc2 [-b 115200 -s forlinxsendata -t 1000 -c 0]" CYAN "\n\t -d devname can list in /dev""\n\t -b baudrate ,can be nmit,default is 115200""\n\t -s sendstring ,can be nmit ,defalut is buffer""\n\t -t time interval for send,can be nmit,default is 1000ms,time <200ms is incorrent""\n\t -c count for send number,can be nmit,0 or >65535 is forever,default is 10" NONE" \n",pname, pname);
}char* getcurrenttime()
{struct tm *tm;time_t time;struct timeval tv;char ret[50];gettimeofday(&tv,NULL);time = tv.tv_sec;tm = localtime(&time);sprintf(ret,"%02d:%02d:%02d-%03d",tm->tm_hour, tm->tm_min, tm->tm_sec,(int)tv.tv_usec/1000);char *r=ret;return r;}static speed_t getBaudrate(int baudrate)
{switch (baudrate){case 0:return B0;case 50:return B50;case 75:return B75;case 110:return B110;case 134:return B134;case 150:return B150;case 200:return B200;case 300:return B300;case 600:return B600;case 1200:return B1200;case 1800:return B1800;case 2400:return B2400;case 4800:return B4800;case 9600:return B9600;case 19200:return B19200;case 38400:return B38400;case 57600:return B57600;case 115200:return B115200;case 230400:return B230400;case 460800:return B460800;case 500000:return B500000;case 576000:return B576000;case 921600:return B921600;case 1000000:return B1000000;case 1152000:return B1152000;case 1500000:return B1500000;case 2000000:return B2000000;case 2500000:return B2500000;case 3000000:return B3000000;case 3500000:return B3500000;case 4000000:return B4000000;default:return -1;}
}int OpenDev(char *Dev)
{speed_t speed;int fdt;struct termios oldtio, newtio;speed = getBaudrate(atoi(baudrate));fdt = open(Dev, O_RDWR | O_NONBLOCK | O_NOCTTY | O_NDELAY);if (fdt < 0){perror(Dev);exit(1);}tcgetattr(fdt, &oldtio);bzero(&newtio, sizeof(newtio));   newtio.c_cflag = speed | CS8 | CLOCAL | CREAD;newtio.c_cflag &= ~CSTOPB;newtio.c_cflag &= ~PARENB;newtio.c_iflag = IGNPAR;newtio.c_oflag = 0;tcflush(fdt, TCIFLUSH);tcsetattr(fdt, TCSANOW, &newtio);tcgetattr(fdt, &oldtio);return fdt;
}void read_port(void)
{     FD_ZERO(&rd);     FD_SET(fd, &rd);       retval = select(fd + 1, &rd, NULL, NULL, &timeout);switch (retval){case 0:  break;case -1:  perror("select");break;default:  if ((nread = read(fd, msg, sizeof(msg))) > 0){recvTotal += strlen(msg);             printf("Dev= %s\tRecvTotal= %05ld  Times= %05d  RecvData= %s    ", dev, recvTotal, recenum, msg);             char *msg1 = msg;if (strcmp(msg1, buffer) == 0)printf(LIGHT_GREEN "Success !" NONE "\n\n");elseprintf(RED "Failed !" NONE "\n\n");memset(msg, '\0', sizeof(msg));if (recenum < 65535){recenum++;}else{recenum = 1;}}break;}
}int start_thread_func(void *(*func)(void *), pthread_t *pthread, void *par, int *COM_STATU)
{memset(pthread, 0, sizeof(pthread_t));int temp;     if ((temp = pthread_create(pthread, NULL, func, par)) != 0){printf("creat thread failed!\n");exit(1);}else{int id = pthread_self();  printf("%s,creat thread %d success\n", dev, id);}return temp;
}void *com_read(void *pstatu )
{while (COM_READ_STATU){pthread_mutex_lock(&mut);       read_port();pthread_mutex_unlock(&mut);        }pthread_exit(NULL);
}void *com_send(void *p)
{unsigned int j = 0;unsigned long sendTotal = 0;while (COM_SEND_STATU){j = write(fd, buffer, strlen(buffer) + 1);  sendTotal += j;sendTotal--;  printf("Dev= %s\tSendTotal= %05ld  Times= %05d  SendData= %s\n", dev, sendTotal, sendnum, buffer);if (sendnum < 65535){sendnum++;}else{sendnum = 1;}if(send_forever==0){if(sendnum>count){COM_SEND_STATU = 0;msleep(sleeptime*2);COM_READ_STATU = 0;exit(0);}}msleep(sleeptime);}pthread_exit(NULL);
}void SignHandler(int iSignNo)
{printf("SignHandler starting \n");COM_SEND_STATU = 0;COM_READ_STATU = 0;printf("Capture signer no : %d \n", iSignNo);exit(1);
}int main(int argc, char **argv)
{     int next_option;int devflag = 0;const char *const short_opt = "hd:b:s:t:c:";const struct option long_opt[] = {{"devices", 1, NULL, 'd'},{"baudrate", 1, NULL, 'b'},{"string", 1, NULL, 's'},{"time", 1, NULL, 't'},{"count",1,NULL,'c'},{NULL, 0, NULL, 0},};do{next_option = getopt_long(argc, argv, short_opt, long_opt, NULL);switch (next_option){case 'd':dev = optarg;devflag = 1;break;case 'b':baudrate = optarg;             break;case 's':if (strlen(optarg) > 0)buffer = optarg;break;case 't':sleeptime = atoi(optarg);if (sleeptime < 200 || sleeptime > 50000){print_usage(argv[0]);exit(1);}break;case 'c':count = atoi(optarg);if (count ==0 || count >65535){send_forever=1;}dev = optarg;devflag = 1;break;case '?':print_usage(argv[0]);exit(1);break;case -1:  if (devflag)break;default:print_usage(argv[0]);exit(1);}} while (next_option != -1);if (dev == NULL){printf("Please input serial device name ,for exmaple /dev/ttymxc2.\n");exit(1);}fd = OpenDev(dev);if (fd > 0){}else{printf("Can't Open Serial Port %s \n", dev);exit(0);}printf("\nWelcome to TTYTEST! Press Ctrl + 'c' to stop.\n\n");pthread_mutex_init(&mut, NULL);if (start_thread_func(com_read, (pthread_t *)&thread[READ_THREAD_ID], (int *)&COM_READ_STATU, (int *)&COM_READ_STATU) != 0){printf("error to leave\n");return -1;}msleep(sleeptime);if (start_thread_func(com_send, (pthread_t *)&thread[SEND_THREAD_ID], (int *)&COM_SEND_STATU, (int *)&COM_SEND_STATU) != 0){printf("error to leave\n");return -1;}pause();
}

执行效果如下:

root@fl-imx6ull:~# ./ttytest
Usage: ./ttytest -d devname -b baudrate -s string -t time -c count
Example : ./ttytest -d /dev/ttymxc2 [-b 115200 -s forlinxsendata -t 1000 -c 0]-d devname can list in /dev-b baudrate ,can be nmit,default is 115200-s sendstring ,can be nmit ,defalut is buffer-t time interval for send,can be nmit,default is 1000ms,time <200ms is incorrent-c count for send number,can be nmit,0 or >65535 is forever,default is 10
root@fl-imx6ull:~# 


创作不易,欢迎点赞关注

嵌入式系统232串口测试笔记相关推荐

  1. 嵌入式系统开发 (复习笔记)

    此书作者:李宥谋 主要是通过设计的ARM指令集和cpu内部的寄存器在内部的定时器的控制下工作.来完成数据运算处理和中断异常处理,外部数据通信通过连接外设接口处理. 目录 一.系统概述 (1)系统的概述 ...

  2. 基于Arm板linux嵌入式系统RS485串口读写通讯

    最近在做基于Arm板linux嵌入式系统的RS485串口读写通讯首先参考 http://bbs.chinaunix.net/thread-3650543-1-1.html上的文章,该文章写道,读的时候 ...

  3. 嵌入式系统如何进行测试?

    首先,质量是设计出来的,而不是测试出来的. 我先说一些我的一些经验,之后想扩展到"嵌入式系统如何保证软件质量?"的问题.因为测试只是方法,质量才是目的. 解决问题的思路有如下几个 ...

  4. 【嵌入式系统开发】学习笔记四:嵌入式开发的基本概念与工具链

    提示:本文内容参考慕课课程:<ARM微控制器与嵌入式系统> 嵌入式开发的基本概念与工具链 前言 一.电路板 1.开发板:EVB(Evaluation board) 2.最小系统板 二.开发 ...

  5. ARM嵌入式系统上OpenCL测试

    By Toradex Giovanni Bauermeister 1). 简介 相比曾经,如今科技设备对处理性能和速度要求越来越高.为了应对这种技术需求,许多公司发明了不少方法来获得更好的处理性能.例 ...

  6. 嵌入式系统应用开发学习笔记(五):HLS

    一. HLS是什么?与VHDL/Verilog有什么关系? HLS全称高层次综合(high level synthesis),采用C/C++等高级语言描述功能,可以降低FPGA代码的开发时间和验证时间 ...

  7. 软考-嵌入式系统设计师:[网络安全:笔记(六)]

    大家不要只收藏不关注呀,哪怕只是点个赞也可以呀!

  8. 软考-嵌入式系统设计师:[多媒体技术:笔记(四)]

    一个大的章节发布一次,相当于一个章节就是一本书,这样知识点也比较集中,复习的话不会太过突兀,我会尽量把自己理解到的东西用更容易懂的话写出来,一家之言,如果有错欢迎指正批评,望共同进步.本节PDF文档免 ...

  9. 嵌入式系统设计师考试笔记之嵌入式系统基础知识

    以下是转帖一位网友的嵌考笔记 嵌入式系统设计师考试笔记之嵌入式系统基础知识 欧浩源(ohy3686@qq.com) 20080818 一.引言 自<嵌入式系统设计师考试复习笔记之存储管理篇> ...

最新文章

  1. 智能猫窝是如何诞生的?详解百度大脑的开放生态
  2. IOS之提示control may reach end of non-void function
  3. python数据类型及使用方法_python 基本数据类型及方法
  4. 微信限量纪念版code封面来啦,速看领取方式
  5. 中文任务型对话系统中的领域分类
  6. 不用math type解决word公式上浮问题
  7. 关于Redis配置主从复制踩到的坑,主机不显示从机的连接信息
  8. 简单网络管理协议SNMP
  9. 从零开始学Pytorch(十)之循环神经网络基础
  10. 手把手教你如何做门店盈亏平衡分析图表,内附模板可直接套用
  11. emqtt 试用(七)追踪
  12. Kubernetes详解(三)——Kubernetes集群组件
  13. 设计模式(3)——装饰者模式
  14. iview组件 eslint校验出错 Parsing error: x-invalid-end-tag
  15. uni-app判断运行机型动态修改样式
  16. 数仓工具—Hive语法之窗口函数first_value和last_value(12)
  17. win2008 r2折腾php7.1记录
  18. matlab 扫雷小游戏
  19. Ubuntu添加和设置默认中文字体
  20. 计算机多媒体就业难点,【计算机专业论文】信息技术在计算机教学中的新研究(共3002字)...

热门文章

  1. 分支定界法 python_分支定界(Branchbound)算法
  2. 企业微信 消息 html,企业微信怎么设置消息提醒
  3. HtmlUnit使用体会
  4. HtmlUnit的简单例子
  5. 学习/思考 - 优秀资源 - 收集
  6. 海思HI3516移植使用AP6181 BCM43362
  7. 【jquery】jquery-icheck radio的点击事件、change事件、获取当前选中的值
  8. android的IBINDER机制
  9. android:foreground
  10. 计算机网络学习(一) 计算机网络概述