📄 wirecomm232.c
字号:
//=========================================================================
// 通信程序(szb 2006/03/13) v1.0.0
//
//
//=========================================================================
#ifndef _COMM232
#define _COMM232
#include "datastru.h"
#include "func.h"
#endif
///////////////////////////////////////////////////////////////////////////
//name:RS232comminit()
//function:RS232通信初始化,USART0
//parameter:none
//return:none
//现将波特率设定为9600bps
///////////////////////////////////////////////////////////////////////////
void RS232comminit(void)
{
unsigned char i;
origRS232 = RqueueRS232;
headRS232 = RqueueRS232;
tailRS232 = RqueueRS232;
hoffsetRS232 = 0;
toffsetRS232 = 0;
RnumberBIT232 = 0;
for (i=0;i<RqueueRS232_Length;i++) //每次复位后,清除接收和发送队列
RqueueRS232[i] = 0;
}
///////////////////////////////////////////////////////////////////////////
//name:RS232offset()
//function:计算循环队列头尾指针偏移量的函数
//parameter:Offset-原偏移量的值,n为移位位数,length为接收队列长度
//return:Offset-新的指针偏移量
//explain:每次在对接收队列进行写入和读出操作时,需要移动头尾指针。我们所
// 设计的接收队列是一个循环队列。为了使头尾指针不超出循环队列规定
// 的范围,我们将接收队列的首地址定位在orig变量中,又分别定义头尾
// 指针的偏移量hoffset以及toffset。每次头尾指针移位的时候,先计算
// 他们的偏移量。最终的头尾指针的位置由偏移量加上orig得到。而偏移
// 量由以下计算函数确定,保证了偏移量的范围在0-(length-1)之间,
// 从而保证了头尾指针不会超出循环队列的范围。
///////////////////////////////////////////////////////////////////////////
int RS232offset(int Offset, int n, int length)
{
return Offset = (Offset + n) % length;
}
///////////////////////////////////////////////////////////////////////////
//name:*RS232voffset()
//function:已知头指针head在循环队列中的指向,求*(headRS232 + n)的值.n可正可负.
//parameter:int n为head前或后偏移量的位数
//return:Pdata = headRS232 + n
//explain:当头指针head比较靠近循环队列的末尾时,(head+n)很可能就指到循环队列外
// 面去了为了防止这种情况发生,需要根据情况先判断(headRS232 + n)是否会溢出,如果
// 溢出则将其重新指回循环队列内部的元素,使队列真正成为一个循环队列.
//update:2003.2.20 by wjg
///////////////////////////////////////////////////////////////////////////
unsigned char *RS232voffset(int n)
{
unsigned char *Pdata;
Pdata = origRS232 + RS232offset(headRS232 - origRS232, n, RqueueRS232_Length);
return Pdata;
}
///////////////////////////////////////////////////////////////////////////
//name:RS232MoveHead()
//function:将头指针在循环队列中移动n位
//parameter:int step,头指针要移动的步数;unsigned char *CommType,通信类型
//return:none
//update:2003.2.20 by wjg
///////////////////////////////////////////////////////////////////////////
void RS232MoveHead(int step)
{
hoffsetRS232 = RS232offset(hoffsetRS232, step, RqueueRS232_Length);
headRS232 = origRS232 + hoffsetRS232;
}
///////////////////////////////////////////////////////////////////////////
//name:COMM232()
//function:RS232通信主函数
//parameter:通信类型RS232
//return:none
///////////////////////////////////////////////////////////////////////////
void COMM232(void)
{
while (headRS232 > tailRS232 && headRS232 - tailRS232 <= RqueueRS232_Length - 3 || tailRS232 - headRS232 >= 3)
{
if ((unsigned char)(*headRS232 + *RS232voffset(1)) == *RS232voffset(2) && (*headRS232 == SlaveAddress || *headRS232 == 0xAA))
{
if (0 != *RS232voffset(1))
{
OnSaleRow = *RS232voffset(1) >> 4;
OnSaleCol = *RS232voffset(1) & 0x0F;
MotorRunEnable = ON;
//MotorPushNum = Clocktime[5];
//CBFNum = Clocktime[5];
}
else if (!(P1IN & BIT7))//只对正转实行松开停止键停转电机的操作
{
MotorStopEnable = ON;
}
RS232MoveHead(3);
}
else
RS232MoveHead(1);
}
}
interrupt[PORT2_VECTOR] void Port2_sensor (void)
{
_DINT();
if (P2IFG & BIT3)
{
TACCR0 = TAR + 110; // 初始值设定为TAR + 19,为了在每个bit中间采样
TACCTL0 = CCIE; //CCR0 interrupt enabled
P2IE = 0;//禁止2.3端口中断
P2IFG = 0; //清除中断标志
RnumberBIT232 = 0;//准备接收第一个bit
}
_EINT();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -