linux下读取串口数据,处理,保存

文章目录

  • 一、下载串口工具
  • 命令行查看使用的串口
  • 三、编程读取串口数据并打印

一、下载串口工具

$ sudo apt-get install cutecom
$ sudo  cutecom

linux下读取串口数据,处理,保存_第1张图片
可以很方便的看到用的哪个串口,以及看到传输的数据

命令行查看使用的串口

如果遇到插入USB设备,虚拟机没有识别到,有可能是虚拟机串口服务程序没有启动
按照下面的操作打开:
1.右键单击我的电脑,选择管理,打开计算机管理
linux下读取串口数据,处理,保存_第2张图片2.进入服务和应用程序
linux下读取串口数据,处理,保存_第3张图片3.启动虚拟机USB服务
linux下读取串口数据,处理,保存_第4张图片4.插入USB,虚拟就就能检测到了
linux下读取串口数据,处理,保存_第5张图片5.命令行查看当前使用的那个串口
linux下读取串口数据,处理,保存_第6张图片可以看到 使用的 /dev/ttyUSB0

接下来就可以编程了

三、编程读取串口数据并打印

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define RCV_NUM (14)
#define uint8_t unsigned char
#define uint16_t unsigned int
//---定义一个和发送端一样的数据结构,用于存放接受的数据
typedef struct __rcv_data{
     
  uint8_t data0;//--包头
  uint8_t data1;//--字节数
  uint16_t data2;//-
  uint16_t data3;//--
  uint16_t data4;//--
  uint8_t data5;//--
  uint16_t data6;//--
  uint8_t data7;//--
  uint8_t data8;//--校验和
  uint16_t data9;//--//--报尾
}ST_RCV;
ST_RCV st_rcv_data = {
     0};

unsigned char buff[20];
unsigned char data[2];
int main()

{
     
  int fd;
  FILE *fp = NULL;
 struct termios st;
 int ch =0;
 /*打开指定的串口*/
 if((fd=open("/dev/ttyUSB0", O_RDWR))<0){
     
  printf("open failed\n");
  exit(1);
 }
/*配置串口*/
 st.c_iflag = 0;
 st.c_oflag = 0;
 st.c_cflag = 0;CS8|CREAD|CLOCAL;
 cfsetospeed(&st, B9600);
 cfsetispeed(&st, B9600);
 tcsetattr(fd, TCSANOW, &st);

 uint8_t nread =0;
/*打开一个CSV文件,用于保存接收到的数据*/
 fp = fopen("./1.csv", "a");
      if(NULL == fp)
         {
     
              printf("文件打开失败\n");
                return -1; //返回错误代码
         }
/*进入主循环*/
 for(;;){
     

  ch =0;
  /*寻找包头*/
  if(read(fd,&ch,1)>0){
     //--找包头
      if(ch == 0xAA)
          {
     
           memset(buff,0,20);
         /*读取包长数据,因为此处已经知道固定包长,就直接用常量*/
         for(int i=0;i<13;i++)
            {
     
             do{
     
                nread = read(fd,&ch,1);//--读一个字节
               }while(nread<=0);//--却到读到数据
              buff[i] = ch;//--将读到的数据存入buff
             }
               st_rcv_data.data8 =0;
              /*计算校验和*/
               for(int i=1;i<=10;i++)
               st_rcv_data.data8 += buff[i];
              /*解析数据,存入对应的结构体数据,此处注意大小端的问题*/
               if(st_rcv_data.data8 ==buff[11])
                   {
     
                    st_rcv_data.data0 =0xaa;
                    memcpy(&st_rcv_data.data1,buff,1);
                    data[0] = buff[2];data[1] = buff[1];
                    memcpy(&st_rcv_data.data2,data,2);
                    data[0] = buff[4];data[1] = buff[3];
                    memcpy(&st_rcv_data.data3,data,2);
                    data[0] = buff[6];data[1] = buff[5];
                    memcpy(&st_rcv_data.data4,data,2);
                    memcpy(&st_rcv_data.data5,buff+7,1);
                     data[0] = buff[9];data[1] = buff[8];
                    memcpy(&st_rcv_data.data6,data,2);
                    memcpy(&st_rcv_data.data7,buff+10,1);
                    st_rcv_data.data9 =0xbb;
                   /*终端显示数据*/
                   printf("%d,%d,%d,%d,%d,%d\n",st_rcv_data.data2,st_rcv_data.data3,st_rcv_data.data4,st_rcv_data.data5,st_rcv_data.data6,st_rcv_data.data7);
                   //--将数据写入csv文件
                   fprintf(fp, "%d,%d,%d,%d,%d,%d\n",st_rcv_data.data2,st_rcv_data.data3,st_rcv_data.data4,st_rcv_data.data5,st_rcv_data.data6,st_rcv_data.data7);  //写入a,b,c到文件中
             }
               
              
          } //--ebd 0xaa  
   }//--endread
 }//--end for(;;)
   close(fd);
   fclose(fp);
   fp = NULL; //需要指向空,否则会指向原打开文件地址  
}//--end main

展示效果
linux下读取串口数据,处理,保存_第7张图片

你可能感兴趣的:(Linux学习笔记,linux,C语言)