IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 串口通信(移植正点原子代码) -> 正文阅读

[嵌入式]串口通信(移植正点原子代码)

小知识点记录:-> 运算为 成员选择(指针)使用形式:对象指针->成员名
例如:
x = p->a;这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x

想要单片机接收上位机发送的长数据,但是单片机每次的接收发送都只有一个字节,那么就只能通过修改接收代码来实现目标。
前提打开串口接收中断
按照正点原子的串口实验例程移植以后
得到如下的判断帧尾的程序
思路大致是——检查当前的数据是否为特定的两个目标数据,如果数据是0x0d,将USART_RX_STA置1,在下一次循环中检测当前数据是否为0x0a。两个特定数据先后检测到才判断一次数据全部接收完成。
这两个数据可以自己来设定。
以下为中断执行函数:
其中uart_getchar()函数是接收一个字节的库
uart_putchar()函数是发送一个字节的库




uint8 USART_RX_BUF[USART_REC_LEN]; 
uint16 USART_RX_STA=0;
void uart1_interrupt_handler (void)
{
	uint8 dat;
	uart_getchar(UART_1, &dat);				//读取接收到的数据
	if((USART_RX_STA&0x8000)==0)			//接收未完成
	{
		if(USART_RX_STA&0x4000)				//接收到了0x0d
		{
			if(dat!=0x0a)USART_RX_STA=0;	//接收错误,重新开始
			
			else USART_RX_STA|=0x8000;		//接收完成了
		}
		else
		{
			if(dat==0x0d)USART_RX_STA|=0x4000;
			else
			{
				USART_RX_BUF[USART_RX_STA&0X3FFF]=dat ;
				USART_RX_STA++;
				if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
			}
		}
	}
}

我在写完程序之后发现传输数据还是有问题,以为是代码有问题。偶然看到一篇博文发现电压电流的不稳定以为是硬件的问题,再经过一系列的排查之后发现是中断优先级的问题,由于其他中断函数的优先级高于串口中断的优先级,所以也会导致数据的收发过程中被打断,导致数据丢失。

以上。
再贴一个自己修改后用于判断帧头然后发送接收到的数据的程序

void classify_command()
{
	uint16 len ,t;
	if(USART_RX_STA&0x8000)
	{
		len=USART_RX_STA&0x3fff;		//得到此次接收到的数据长度
		if(USART_RX_BUF[0] == '1')
		{
		printf("\r\n您发送的消息为:\r\n\r\n");
		for(t=0;t<len;t++)
			{
				uart_putchar(UART_1, USART_RX_BUF[t]);//向串口1发送数据
				USART_RX_BUF[t] = 0;
			}

		printf("\r\n\r\n");//插入换行
		}
		else printf("\r\n数据错误\r\n\r\n");
		USART_RX_STA=0;
	}

}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-22 14:50:57  更:2021-09-22 14:52:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:32:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码