当前位置:网站首页>串口数据帧
串口数据帧
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;//接收数据错误,重新开始接收
}
}
}
}
}
另外的一种方法:
边栏推荐
- Solana chain application crema was shut down due to hacker attacks
- 嵌入式开发:技巧和窍门——提高嵌入式软件代码质量的7个技巧
- Xiangjiang Kunpeng joined the shengteng Wanli partnership program and continued to write a new chapter of cooperation with Huawei
- LOGO特训营 第五节 字体结构与设计常用技法
- Implementation rules for archiving assessment materials of robot related courses 2022 version
- 好用app推荐:扫描二维码、扫描条形码并查看历史
- Logo special training camp Section V font structure and common design techniques
- 【Acwing】第58场周赛 题解
- php短视频源码,点赞时会有大拇指动画飘起
- PostgreSQL JOIN实践及原理
猜你喜欢
Redis sentinel simply looks at the trade-offs between distributed high availability and consistency
Visual task scheduling & drag and drop | scalph data integration based on Apache seatunnel
Ascendex launched Walken (WLKN) - an excellent and leading "walk to earn" game
Logo special training camp Section IV importance of font design
Logo special training camp section 1 Identification logo and logo design ideas
Introducing QA into the software development lifecycle is the best practice that engineers should follow
Xiangjiang Kunpeng joined the shengteng Wanli partnership program and continued to write a new chapter of cooperation with Huawei
i.MX6ULL驱动开发 | 24 - 基于platform平台驱动模型点亮LED
嵌入式开发:技巧和窍门——提高嵌入式软件代码质量的7个技巧
凭借了这份 pdf,最终拿到了阿里,字节,百度等八家大厂 offer
随机推荐
Prosperity is exhausted, things are right and people are wrong: where should personal webmasters go
Recommendation of mobile app for making barcode
Microservices -- Opening
Enabling digital economy Fuxin software attends the BRICs high level Forum on Sustainable Development
阿里推出新品牌“瓴羊”,致力成为“数字化领头羊”
The sandbox has reached a cooperation with digital Hollywood to accelerate the economic development of creators through human resource development
HBuilder X 常用的快捷键
The table is backed up in ODPs. Why check m in the metabase_ Table, the logical sizes of the two tables are inconsistent, but the number of
Huawei Nova 10 series released Huawei application market to build a solid application security firewall
好用app推荐:扫描二维码、扫描条形码并查看历史
Force buckle_ Palindrome number
Interview essential leetcode linked list algorithm question summary, whole process dry goods!
LOGO special training camp section I identification logo and Logo Design Ideas
Google Earth Engine(GEE)——以MODIS/006/MCD19A2为例批量下载逐天AOD数据逐天的均值、最大值、最小值、标准差、方差统计分析和CSV下载(北京市各区为例)
Common open source codeless testing tools
Force buckle 2_ 1480. Dynamic sum of one-dimensional array
Deployment of JVM sandbox repeater
力扣2_1480. 一维数组的动态和
You don't have to run away to delete the library! Detailed MySQL data recovery
Interview question 01.01 Determine whether the character is unique