一、下载串口工具
$ 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
展示效果