历史上的今天
今天是:2025年02月03日(星期一)
2020年02月03日 | 基于51单片机的串口中断发送数据帧
2020-02-03 来源:elecfans
很少看到有资料写如何以中断的方式发送一帧数据,如果以等待的发送数据帧,对高速运行的单片机来说是很浪费时间的,下面就介绍一种使用中断方式发送数据帧,操作平台采用51 mcu
首先定义一个数据帧的结构体,该结构体可以做为一个全局变量,所有的发送都要经过这个结构体:

//结构体
struct {
char busy_falg;//忙标志,若在发送数据时置位1,即在开始发送置位1,发送结束置位0
int index;//索引,指向需要发送数组的位置
int length;//整个数据帧的长度
char *buf;//指向需要发送的数据帧,建议为全局变量,否则一旦开始发送,必须等到发送结束,即判断busy_falg为0
} send_buf;
发送数据的函数,这里有个缺点,就是还是要使用while来检测串口是否忙碌,不过这样比占用系统时间来发送要好的多了:
//发送一帧
void SendBuf(char *buf,int length)
{
while(busy_falg);//查询发送是否忙,否则循环等待
send_buf.length = length;
send_buf.index = 0;
send_buf.buf = buf;
send_buf.busy_falg = 1;
SBUF = send_buf.buf[0];//写入SBUF,开始发送,后面就自动进入中断发送
}
串口中断发送函数,注意设置空闲标志位,避免多任务时多个发送帧调用了同一个结构体:
void SerialInt() interrupt 4 //串口中断
{
if(RI == 1) //串口接收
{
RI = 0;
}
else if(TI == 1)//串口发送
{
TI = 0;
send_buf.index++;
if(send_buf.index == send_buf.length)
{
send_buf.busy_falg = 0;//发送结束
return;
}
SBUF = send_buf.buf[send_buf.index];//继续发送下一个
}
}
串口中断发送就是这样简单,注意busy_falg和index的使用。
史海拾趣
|
再发贴:windows ce 5.0 系统 网页浏览器问题(难!急!) 我有一款PDA ,用的是Windows CE 5.0的系统,系统自带的IE浏览器不好用,我想换一款,请问那一款能用?发给我试试!谢谢! Mozilla minimo ,NetFront,Ucweb,Opera,Deepfish等都不行,好象支持Windows CE系统的软件很少,大部分都是 ...… 查看全部问答> |
|
我的开发板是2410 板上有4个按忸 其中一个被定义成 重启 这个定义在那呢? 我想自己开发按忸的驱动 该怎么做呢 (50)分 求一些驱动开发 资料 (50)分 分不是问题 求高人帮助 … 查看全部问答> |
|
版主:你好 我现在主用STM32芯片发现一个问题,请教一下! 我写了一段程序测试时间, 使能Prefetch buffer测试时间是11.5us 不使能Prefetch buffer测试时间是14.5us 相 ...… 查看全部问答> |
|
【MSP430共享】由SA51和MSP430F1121组成的驱动控制系统 现在的电子设备往往要求体积小 、 重量轻 、 效率 高, 通常在苛刻的环境条件下 , 尤其在军工产品中, 设计 者非常希望使 用单 片或双 片系统 以尽可能地减少器件数量。S A 5 1 和 MS P 4 3 0 F 1 1 2 1 以其 自身的高集 成度和强 大功能成 ...… 查看全部问答> |
|
这是我的一些Xilinx的FPGA的论文,传上来给大家分享一下!大家多多支持啊! 我会分批上传,方便大家选择性的交流与下载!… 查看全部问答> |




