录入设备——51单片机设计思路及过程(2)——串口通讯协议

❤2018.3.2

这又是一个半路开始的记录,此前已经实现了串口的固定字节长度通信,现在正在准备用最小系统板实现指定的串口通讯协议。

以上

串口通讯初始化及特殊功能寄存器设置:

void UartInit()	//串口初始化
{


	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON  = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFA;		//设定定时器初值 9600bps
	TH1 = 0xFA;		//设定定时器重装值 9600bps
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	IE=0x00;		//禁止中断
	IP=0x00;		//优先级清零
	EA=1;			//开总中断
	ES=1;			//开串口中断
}

❤2018.3.3

关于串口通讯协议我收到的大概是这样的格式

格式: [协议头] [1字节(表示内容长度)] [内容] [协议尾]

协议头 FF FF 00    协议尾 FB 01 FF 

例:FF FF 00 05 CA 01 2C 02 58 FB 01 FF

然后反馈并执行相应功能。


关于串口中断函数我现在初步构想是这样的:


这是个逻辑流程图,不是具体的实现流程,因为串口中断是每接收一个字节都会触发一次的,所以有些判断语句是贯穿始终的,这就需要不少的标量作为标记,如果都写在流程图里就很乱了,具体是怎样写我还没想好。



❤2018.3.6

○xdata可以将大数组保存到外部ram中,防止占用过多内存,这里可以摘一下相关文章。


❤2018.3.7

疑问:

○中断能打断自己么?

    查了查资料,好像不行,同级别的中断不会被打断,只能被高级中断打断,同级别的中端会等中断函数执行结束之后再触发。(是这样的么?)

○怎么算中断函数执行结束?中断函数调用的函数还算不算中断函数?

○延时函数被中断打断,如何在中断结束后进入主函数?

○关于中断服务函数using的用法

○有时候有两种想法不知道用哪个好时可以都记录下来在应用的过程中很可能就想明白了,比如这次到底是声明一个新的变量表示正在接收数据还是用已有的标志变量最后发现还是得用个新的变量哈哈哈。


❤2018.3.10

好烦,mdcsdn告诉我保存成功了结果之前打的都没了,还得再打一遍。


○昨天遇到的一个问题就是我的bReceiving标记只在串口数据接收第一个字节时置1,理论上在第一个字节接收结束时就应该被主循环的监测函数置0才对,但是实际情况是只要串口一直在接收数据,那么这个标记就一直保持1,我的推测是可能如果串口一直在接收数据则串口中断服务函数就一直处于激活状态而不会回到主循环。不过现在这个问题还不影响程序的功能,如果以后有影响的话我在考虑,现在先放着,或者以后有相关资料正是我的推测我再来补充,先码一个。

————好吧好吧,主要还是test里的延时1s惹的祸


○今天构思了一下T0定时器中断服务函数,功能如下:

1、在串口数据接收超时时,自动将相关标记置0并将错误标记置1,;

2、根据串口通讯协议,在录入过程中需要每秒发送一次反馈数据。

流程图初步构想如下:



○串口中断服务程序经过一系列的修改之后功能已经基本稳定,目前的逻辑流程图如下:

我只写了逻辑流程图,并没有写结构流程图(因为懒。。),流程图中省略了一些标记变量和清零等操作,总之大概是这么个意思。


○串口数据发送函数

这个这个函数加入了串口发送超时退出,防止程序卡死,不过真的会发送超时么?

void Send()		/*串口数据发送函数*/
{
	unsigned char i = 0;
	unsigned char j = 0;
	ES = 0;
	for(i = 0; i < 8; i++)
	{
		SBUF = aFeedBackSample[i];
		while(!TI)		//这个是实现串口数据发送超时退出,但是不报错,就是为了防止程序卡死
		{
			j++;
			if(j > 10000)
				break;
		}
		TI = 0;
	}
	aFeedBackSample[3] = 0x00;
	aFeedBackSample[4] = 0x00;	
	ES = 1;
}



☆总结:

截至2018.3.10基本实现了串口的接收和发送所需要的所有功能,接下来就是写对端口数据的解析,执行函数,还有一些应答函数,这个版本就到这里了,下面的版本会新建一个文件。


总体来说过程还算顺利,虽然遇到一些小问题,但是还没碰到毫无思路这种情况
其实这就是个小程序,只是我一直在拖延而已。。。
我还没想好把程序分成几个文件之后怎么去控制版本的问题。。。或者这次就不做每个文件的版本控制了,以后遇到更复杂的程序再说吧,然后再参考参考其他现成的例子


好了,over


❤2018.3.14

补充:

事情是这样的,我之前把串口接收超时报错的程序放在了主循环中,但是这样有一个问题:当键盘正在录入中时如果传来串口数据,那么在触发串口中断之后并不会回到主程序,于是串口接收超时检测并不会被触发,这样在录入过程中如果收到不正确的指令则不会报错也不会清空缓存,而后再接到正确指令后也不会正确响应,所以影响还是挺大的。于是我把原来放在主循环状态检测函数里的判断串口数据超时的语句放在了串口中断服务程序最后那里。

但是我犯了一个错误,之前为了用一个定时器分别实现串口接收超时和录入过程中反馈两个功能,所以在每次调用函数时都进行了计时器赋初值,但是在将语句放入串口中断服务中后我以为初值不变的话每次启用都会自动重置,但是我想错了,TR和ET只是开启和关闭,并没有赋初值的功能,所以就造成了每接收一定的字符数后就会报错,经过排除确定是超时报警的问题,再一考虑才想起来是初值的问题。

好了,先这样,有什么问题我再来补充。


❤2018.4.16

今天整理了下串口通讯程序,把串口中断服务程序的结构流程图做了做,下面贴出来


然后逻辑流程图也稍稍改了改


总的来说没变,只是进行了调整。


❤2018.4.19

之前记下来结果忘记了,指令解析函数要放在串口中断服务程序里,因为需要实现在敲击过程中能够执行停止指令,所以又修改了下流程图,如下:

逻辑流程图:


结构流程图:


猜你喜欢

转载自blog.csdn.net/ooorczgc/article/details/79424495