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

一、下载串口工具

$ sudo apt-get install cutecom
$ sudo  cutecom

在这里插入图片描述
可以很方便的看到用的哪个串口,以及看到传输的数据

命令行查看使用的串口

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

接下来就可以编程了

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

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <time.h>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

#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

展示效果
在这里插入图片描述

  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值