工程文件:https://github.com/A-Y-1/HNU

上课用老师的代码速通了,懒得改,直接一个字节一个字节读数据),可以学习python串口接收的方法,可以得到更好的结果。

update4.24:这里我的代码用了老师的com.c,第三题里面有两个输出为了不干扰密码显示我注释掉了,另外如果用代码的话记得要改学号

centos下串口测试_单片机

main.c里的学号要改:

centos下串口测试_数据_02


update4.25

下面的报告参考就好,我更新了代码,一年前写的太垃圾了(/ □ \),github更新了2023的版本,其他文件就是上面提到的注释了两个输出:

main.c

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include "com.h"
#include "com.c"
unsigned char func(unsigned char a);
int main(void)
{
	unsigned char tmp[20]; //用于存放读取出来的数据的缓冲区
	int rl; //读取数据的长度(单位:字节)
	int i;
 
	fd = openSerial("/dev/ttyS1"); //打开串口,ttyUSB0是串口文件,在我的虚拟机上是ttyS1,根据你的虚拟机串口修改!!!!!!!!!!!!!!
	
	if(fd < 0)
	{
		printf("open com fail!\n");
		return 0;
	}
	
	EpollInit(fd); //初始化终端事件触发函数epoll,设置要监听的事件及相关参数等
	
	unsigned char buf[]={0xAA,0x55,};	//你的学号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	if(write(fd,buf,14)<=0) printf("write failed!\n");
	int count=0;
	int start=1000;
	unsigned char temp; 
	
	while(1){
		//bzero(tmp,sizeof(tmp)); 				//置零
		rl = ComRead(tmp,20);					//读取数据,读到足够多
		if(rl<6) continue;
		//输出读到的内容
		printf("读取数据:");
		for(i = 0; i < rl; i++)
			printf(" %02x", tmp[i]);
		printf("\n");
		//取出密码
		start = tmp[2];
		for(i=2;i<6;i++){
			buf[i] = tmp[(int)tmp[2]-3+i];
		}
		printf("密码为:");
		for(i=2;i<6;i++){
			printf(" %02x", buf[i]);
		}
		printf("\n\n");
		if(write(fd, buf, 6) <= 0)
      			printf("Write Failed!\n");
	}
	close(epid);
	close(fd);
	return 0;
}

串口使用与测量实验1

一.实验目的

1.学习linux系统的基本使用,常见命令。

2.使用示波器观察STC单片机UART串口输出信号。

3.学习使用Linux下io函数read、write和epoll函数,实现串口数据通信。

二.实验过程

1.linux操作系统平台

        安装firstrun.deb包

        使用指令sudo dpkg -i firstrun.deb 进行安装

centos下串口测试_数据_03

        运行根目录下的/gettips

centos下串口测试_centos下串口测试_04

        运行指令切换到2中提供的目录,提示权限不够,需要修改权限,修改后仍不能切换,直接切换到root用户,进入该目录

centos下串口测试_数据_05

        ls查看并使用vim打开文件

centos下串口测试_数据_06

centos下串口测试_串口_07

        使用如下命令提交

        curl "132.232.98.70:6363/check?id=202004061409&v=3350346463"

        提交后返回OK,再次提交返回DUP

centos下串口测试_centos下串口测试_08

2. Linux平台串口数据接收

      向STC单片计算机板下载程序

centos下串口测试_单片机_09

        使用示波器观察STC单片机UART串口输出信号,识别单片机发送数据所使用的波特率:

centos下串口测试_centos下串口测试_10

      下降沿与上升沿间隔0.84ms,计算出波特率为1200。

      修改C语言程序从虚拟机的串口读取数据的波特率为1200,运行程序,读取单片机的序列号为f4490220202042690040d4

centos下串口测试_串口_11

        将序列号提交。

centos下串口测试_单片机_12

3.计算机串口数据收发与测量

    向单片机下载程序,波特率为1200,可以接收到序列号,接收到的序列号为:ad1d37ad1a5a796641ca90

centos下串口测试_单片机_13

        根据实验要求,需要向串口写入学号,读取密码,再写入密码,不断重复至不出现新的密码。编写程序,在读取串口数据实验给出的参考代码中进行修改,使程序能够完成读取发送数据的功能。

        向串口写数据,只需要使用write函数,传入文件描述符,写入内容的指针,字节数。首先定义一个缓冲区,内容为AA55+学号,先向串口写入。后续发送密码仍然使用这个缓冲区,由于密码在一串数据中的位置不确定,这里缓冲区多留出了一点空间,共18个字节。

centos下串口测试_单片机_14

        发送学号后,串口将接收到包含密码的数据,数据格式为AA+55+密码位置+填充符+密码。为了根据密码位置找到密码,需要对这一串数据进行计数,在读取数据时,按字节读入数据,并记录前一个字符,前一个字符为AA,该字符为55时,将count计数设置为2,然后下一个字符为密码位置,将密码写入缓冲区中,并向串口写入。读取数据并写入密码的部分代码如下:

centos下串口测试_其他_15

        运行程序,可以得到不断变化的密码。以上是逻辑正确的程序。最初编写的一个程序只识别了AA就开始了新的一串计数读取,但因为该单片机没有包含AA的密码所以不影响使用,且循环中的处理是读到AA后再while循环读取,不易理解,这个最初编写的代码也附在工程文件中(main1.c)。

centos下串口测试_其他_16

        将最终得到的密码提交,得到的是第72个密码。

centos下串口测试_其他_17

        可以看到,每5次相同的密码之后才会出现新的密码,这可能与读取数据是单字节读入有关,读到完整的密码需要串口接收5串数据才能完成,如果修改为一次读多字节数据,应该可以更快的读到密码并写入数据,得到更多密码。但相应的计数也要处理,因为一次能读取到的字节数可能是不确定的。由于时间有限,没有完成多字节读取的程序编写和尝试。

三.实验总结

1.涉及知识点

  • Linux操作系统的用户与组
  • 文件的权限与权限修改命令
  • 目录,文件操作相关命令
  • 串口波特率以及使用示波器测量波特率
  • 单片机程序的下载以及串口调试方法
  • Linux的IO操作函数
  • 串口数据收发

2.总结

      通过实验进一步熟悉了linux操作系统的使用。熟悉了单片机下载程序,调试串口的方法,理解了使用IO函数实现的串口数据的收发。编写串口数据收发程序也进一步体会了如何对串口数据进行处理。在编写程序时先编写了一个复杂且存在错误的版本,后重新编写了清晰,正确的版本,加深了理解。在读取串口数据实验观察到读取13个字节,但每次总是只读到1个字节,因此编写串口收发数据时直接采用了单个字节读取的方式,导致程序性能差,得到的密码少。这里还可以进行重新改写优化。试用c++或python或许也有更好的结果,后续可以继续了解不同语言读取串口的方法。