当前位置:网站首页>串口数据帧
串口数据帧
2022-07-04 22:17:00 【让一切都燃烧】
任务要求
思路
1 a5 01 b4 有效01
2 a5 a5/b4 b4 有效a5/b4
3 01 b4 a5 01 报错
4 a5 01 02 b4 报错
5 随机无效 a5 01 b4 随机无效 有效01
有效数据就是你需要得到的有用数据
帧头 帧尾是固定的
无效数据就是不符合帧头+有效数据+帧尾三字节格式的
一个字节是十进制0~255也就是十六进制0x00到0xff
一串任意长度的数据,只要里面有三个字节是 帧头+一字节数据+帧尾 那就是有效数据
数据长度不匹配,帧头或帧尾不匹配,都是无效数据
再给大家一些方向,串口的中断服务函数每当串口接收到一个字节的时候就会被调用一次,每次中断获取一个字节,但是任务要求判断一个多字节的数据帧,所以必然需要把接收到的数据先保存起来
使用静态变量static或者全局变量来临时保存数据,必须使用中断,学有余力可以使用dma
查询式串口接收毫无意义
主要使用的串口是usart1 28-33
使用的是30-31
TX发送端口 RX接受端口
查询中断 disable
enable
想要接受多组数据需要定义一个数组,然后把数据一次放入数组中
现在只能实现前四种情况:
完成代码:
main.c
int main (void){
//主程序
delay_ms(500); //上电时等待其他器件就绪
RCC_Configuration(); //系统时钟初始化
// RELAY_Init();//继电器初始化
I2C_Configuration();//I2C初始化
OLED0561_Init(); //OLED初始化
OLED_DISPLAY_8x16_BUFFER(0," YoungTalk "); //显示字符串
// OLED_DISPLAY_8x16_BUFFER(3," True "); //显示字符串
LED_Init();//LED初始化
USART1_Init(115200); //串口初始化,参数中写波特率
USART1_RX_STA=0xC000; //初始值设为有回车的状态,即显示一次欢迎词
while(1){
if(USART1_RX_STA&0xC000){
//如果标志位是0xC000表示收到数据串完成,可以处理。
if((USART1_RX_STA&0x3FFF)==0){
//单独的回车键再显示一次欢迎词
printf("\033[1;47;33m\r\n"); //设置颜色(参考超级终端使用)
// printf(" 1y--开LED1灯 1n--关LED1灯 \r\n");
// printf(" 2y--开LED2灯 2n--关LED2灯 \r\n");
printf(" 请输入控制指令,按回车键执行! \033[0m\r\n");
}else if((USART1_RX_STA&0x3FFF)==6 && USART1_RX_BUF[0]=='5' && USART1_RX_BUF[1]=='a'&&USART1_RX_BUF[4]=='b'&&USART1_RX_BUF[5]=='4'){
//判断数据是不是2个,第一个数据是不是“1”,第二个是不是“y”
OLED_DISPLAY_8x16_BUFFER(1," TRUE:");
OLED_DISPLAY_8x16(1,8*8,USART1_RX_BUF[0]);//显示有效数据
OLED_DISPLAY_8x16(1,9*8,USART1_RX_BUF[1]);//
OLED_DISPLAY_8x16(1,10*8,USART1_RX_BUF[2]);//
OLED_DISPLAY_8x16(1,11*8,USART1_RX_BUF[3]);//
OLED_DISPLAY_8x16(1,12*8,USART1_RX_BUF[4]);//
OLED_DISPLAY_8x16(1,13*8,USART1_RX_BUF[5]);//
printf("命令有效!\r\n");
}else{
//如果以上都不是,即是错误的指令。
OLED_DISPLAY_8x16_BUFFER(1," FALSE: ");
printf("指令错误!\r\n");
}
USART1_RX_STA=0; //将串口数据标志位清0
}
}
}
此方法只是把三个字节的长度固定,然后把第一个和最后一个做头帧尾帧处理,如果不符合数据长度以及头尾匹配的,都是错误的。
中断函数用了原有的判断回车
中断里面是原有的判断回车的,因为洋桃视频里就是用了超级终端,他没有发送键所以是需要判断回车,所以用其他的串口助手因为有发送键所以需要有发送新行来判断是否有回车
usart.c
void USART1_IRQHandler(void){
//串口1中断服务程序(固定的函数名不能修改)
u8 Res;
//以下是字符串接收到USART_RX_BUF[]的程序,(USART_RX_STA&0x3FFF)是数据的长度(不包括回车)
//当(USART_RX_STA&0xC000)为真时表示数据接收完成,即超级终端里按下回车键。
//在主函数里写判断if(USART_RX_STA&0xC000),然后读USART_RX_BUF[]数组,读到0x0d 0x0a即是结束。
//注意在主函数处理完串口数据后,要将USART_RX_STA清0
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
//接收中断(接收到的数据必须是0x0d 0x0a结尾)
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
printf("%c",Res); //把收到的数据以 a符号变量 发送回电脑
if((USART1_RX_STA&0x8000)==0){
//接收未完成
if(USART1_RX_STA&0x4000){
//接收到了0x0d
if(Res!=0x0a)USART1_RX_STA=0;//接收错误,重新开始
else USART1_RX_STA|=0x8000; //接收完成了
}else{
//还没收到0X0D
if(Res==0x0d)USART1_RX_STA|=0x4000;
else{
USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ; //将收到的数据放入数组
USART1_RX_STA++; //数据长度计数加1
if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
另外的一种方法:
边栏推荐
- MySQL storage data encryption
- Zhiyang innovation signed a cooperation agreement with Huawei to jointly promote the sustainable development of shengteng AI industry
- LOGO特训营 第五节 字体结构与设计常用技法
- 达梦数据凭什么被称为国产数据库“第一股”?
- Redis sentinel simply looks at the trade-offs between distributed high availability and consistency
- # 2156. Find the substring of the given hash value - post order traversal
- Google Earth Engine(GEE)——Tasks升级,实现RUN ALL可以一键下载任务类型中的所有影像
- How to reset the password of MySQL root account
- leetcode 72. Edit Distance 编辑距离(中等)
- ACM multimedia 2022 | counterfactual measurement and elimination of social prejudice in visual language pre training model
猜你喜欢
醒悟的日子,我是怎么一步一步走向软件测试的道路
【Acwing】第58场周赛 题解
The sandbox has reached a cooperation with digital Hollywood to accelerate the economic development of creators through human resource development
NFT insider 64: e-commerce giant eBay submitted an NFT related trademark application, and KPMG will invest $30million in Web3 and metauniverse
10 schemes to ensure interface data security
Li Kou 98: verify binary search tree
BigFilter全局交易防重组件的介绍与应用
Energy momentum: how to achieve carbon neutralization in the power industry?
业务太忙,真的是没时间搞自动化理由吗?
[the 2023 autumn recruitment of MIHA tour] open [the only exclusive internal push code of school recruitment eytuc]
随机推荐
Easy to use app recommendation: scan QR code, scan barcode and view history
php短视频源码,点赞时会有大拇指动画飘起
繁華落盡、物是人非:個人站長該何去何從
Why is Dameng data called the "first share" of domestic databases?
阿里推出新品牌“瓴羊”,致力成为“数字化领头羊”
Concurrent optimization summary
力扣3_383. 赎金信
Use blocconsumer to build responsive components and monitor status at the same time
i.MX6ULL驱动开发 | 24 - 基于platform平台驱动模型点亮LED
LOGO特训营 第五节 字体结构与设计常用技法
Google Earth Engine(GEE)——Tasks升级,实现RUN ALL可以一键下载任务类型中的所有影像
Prosperity is exhausted, things are right and people are wrong: where should personal webmasters go
Scala download and configuration
Deveco device tool 3.0 release brings five capability upgrades to make intelligent device development more efficient
我在linux里面 通过调用odspcmd 查询数据库信息 怎么静默输出 就是只输出值 不要这个
【愚公系列】2022年7月 Go教学课程 003-IDE的安装和基本使用
Éducation à la transmission du savoir | Comment passer à un test logiciel pour l'un des postes les mieux rémunérés sur Internet? (joindre la Feuille de route pour l'apprentissage des tests logiciels)
微服务--开篇
Shell 脚本实现应用服务日志入库 Mysql
高中物理:直线运动