📄 wirecomm485.c
字号:
TqueueRS485[0] = *headRS485;// 构造发送队列
TqueueRS485[1] = 0x03;
TqueueRS485[2] = SOEBYTEnum * 8 + 4;//发送的数据字节数 = 发送记录的条数 * 8 + 4
TqueueRS485[3] = *(RS485voffset(3));
TqueueRS485[4] = *(RS485voffset(4));
TqueueRS485[5] = *(RS485voffset(5));
TqueueRS485[6] = *(RS485voffset(6));
for (i=0 ;i<SOEBYTEnum;i++)
{
TqueueRS485[7+8*i] = FM_byte_read(SOEPosition_send);
TqueueRS485[8+8*i] = FM_byte_read(SOEPosition_send+1);
TqueueRS485[9+8*i] = FM_byte_read(SOEPosition_send+2);
TqueueRS485[10+8*i] = FM_byte_read(SOEPosition_send+3);
TqueueRS485[11+8*i] = FM_byte_read(SOEPosition_send+4);
TqueueRS485[12+8*i] = FM_byte_read(SOEPosition_send+5);
TqueueRS485[13+8*i] = FM_byte_read(SOEPosition_send+6);
TqueueRS485[14+8*i] = FM_byte_read(SOEPosition_send+7);
SOEPosition_send = SOEPosition_send + 8;//记录指针指向FRAM中的下一条记录
if (SOEPosition_send > 0x7FF8)//边界判断
SOEPosition_send = SOE_REC_BASE;
}
tlengthRS485 = 5 + SOEBYTEnum * 8 + 4; //队列长度 = 5 + 发送的数据字节数
crccalculate = RS485crc_count(TqueueRS485, tlengthRS485 - 2, 0);
TqueueRS485[tlengthRS485 - 1] = (unsigned char)crccalculate;
TqueueRS485[tlengthRS485 - 2] = (unsigned char)(crccalculate >> 8);
RS485Send_Tqueue(9); //发送数据,接收队列的头指针后移9位,表示已处理完对该帧的应答
}
return;
}// end of RS485operate03()
///////////////////////////////////////////////////////////////////////////
//name: RS485operate123()
//function: 功能代码为0x7B时的处理函数
//parameter:unsigned char *CommType,通信类型(RS485)
//return: none
///////////////////////////////////////////////////////////////////////////
void RS485operate123(void)
{
unsigned int crccalculate;
if (RS485crc_check(headRS485, headRS485 + 5, 1) == 0) //如果是后续查询帧
{
RS485MoveHead(1);
return;
}
if (!MotorRunEnable)
{
OnSaleRow = *RS485voffset(3);
OnSaleCol = *RS485voffset(4);
MotorRunEnable = ON;
}
TqueueRS485[0] = *headRS485;// 构造发送队列
TqueueRS485[1] = 0x7B;
TqueueRS485[2] = 0;
tlengthRS485 = 5;
crccalculate = RS485crc_count(TqueueRS485, tlengthRS485 - 2, 0);
TqueueRS485[tlengthRS485 - 1] = (unsigned char)crccalculate;
TqueueRS485[tlengthRS485 - 2] = (unsigned char)(crccalculate >> 8);
RS485Send_Tqueue(7); //发送数据,接收队列的头指针后移7位,表示已处理完对该帧的应答
return;
}// end of RS485operate123()
///////////////////////////////////////////////////////////////////////////
//name:RS485operate125()
//function: 125功能码实现计数板当前程序版本查询命令
//parameter:unsigned char *CommType,通信类型(RS485或者CAN)
//return: none
//update: 2006-11-23 szb 程序版本格式示例为:“CNT1010V1.0”,加上最后的中止字符共12个字符长度
///////////////////////////////////////////////////////////////////////////
void RS485operate125(void)
{
unsigned int crccalculate;
unsigned char i;
char ver[12] = VERSION;
if(!RS485crc_check(headRS485, headRS485 + 3, 1))// CRC校验错误,该帧长度5字节
{
RS485MoveHead(1);
return;
}
TqueueRS485[0] = *headRS485;// 构造发送队列
TqueueRS485[1] = 0x7D;
TqueueRS485[2] = 12;//数据量
for (i=0;i<12;i++)
TqueueRS485[i+3] = ver[i];
tlengthRS485 = 17;
crccalculate = RS485crc_count(TqueueRS485, tlengthRS485 - 2, 0);
TqueueRS485[tlengthRS485 - 1] = (unsigned char)crccalculate;
TqueueRS485[tlengthRS485 - 2] = (unsigned char)(crccalculate >> 8);
RS485Send_Tqueue(5); //发送数据,接收队列的头指针后移5位,表示已处理完对该帧的应答
return;
}// end of RS485operate125()
///////////////////////////////////////////////////////////////////////////
//name:RS485operate126()
//function: 126功能码实现计数板时间查询命令
//parameter:unsigned char *CommType,通信类型(RS485或者CAN)
//return: none
//update: 2006-03-20 szb 时间顺序为年,月,日,小时,分,秒
///////////////////////////////////////////////////////////////////////////
void RS485operate126(void)
{
unsigned int crccalculate;
if(!RS485crc_check(headRS485, headRS485 + 3, 1))// CRC校验错误,该帧长度5字节
{
RS485MoveHead(1);
return;
}
TqueueRS485[0] = *headRS485;// 构造发送队列
TqueueRS485[1] = 0x7E;
TqueueRS485[2] = 6;//数据量
TqueueRS485[3] = Clocktime[0];//年
TqueueRS485[4] = Clocktime[1];//月
TqueueRS485[5] = Clocktime[2];//日
TqueueRS485[6] = Clocktime[3];//时
TqueueRS485[7] = Clocktime[4];//分
TqueueRS485[8] = Clocktime[5];//秒
tlengthRS485 = 11;
crccalculate = RS485crc_count(TqueueRS485, tlengthRS485 - 2, 0);
TqueueRS485[tlengthRS485 - 1] = (unsigned char)crccalculate;
TqueueRS485[tlengthRS485 - 2] = (unsigned char)(crccalculate >> 8);
RS485Send_Tqueue(5); //发送数据,接收队列的头指针后移5位,表示已处理完对该帧的应答
return;
}// end of RS485operate126()
///////////////////////////////////////////////////////////////////////////
//name:RS485operate127()
//function: 127功能码实现,校时命令
//parameter:unsigned char *CommType,通信类型(RS485或者CAN)
//return: none
//update: 2006-03-20 szb 时间顺序为年,月,日,小时,分,秒
///////////////////////////////////////////////////////////////////////////
void RS485operate127(void)
{
unsigned char j;
//unsigned char dataamount;
//dataamount = *RS485voffset(2);// 数据数量6
// 数据数量错误
//if(dataamount != 6)
//{
//RS485MoveHead(1);
//return;
//}
if(!RS485crc_check(headRS485, headRS485 + 9, 1))// CRC校验错误,该帧长度11字节
{
RS485MoveHead(1);
return;
}
_DINT(); //校时过程中关闭中断
for (j = 0;j < 6;j++)
Clocktime[j] = *RS485voffset(j + 3); //ClockTemp[j]规定为unsigned char类型
_EINT();
RS485MoveHead(11); //头指针后移一个帧长度(11字节)
return;
}// end of RS485operate127()
///////////////////////////////////////////////////////////////////////////
//name:COMM485()
//function:RS485通信主函数
//parameter:通信类型RS485
//return:none
///////////////////////////////////////////////////////////////////////////
void COMM485(void)
{
unsigned char FuncCode;//功能码
while (headRS485 > tailRS485 && headRS485 - tailRS485 <= RqueueRS485_Length - 5 || tailRS485 - headRS485 >= 5)
{
if(*headRS485 == SlaveAddress || *headRS485 == 255)// 从站地址为本站地址或广播地址
{
if (headRS485 - origRS485 == RqueueRS485_Length - 1)
FuncCode = *origRS485;// FuncCode即为原来的*(headRS485+1)
else
FuncCode = *(headRS485 + 1);
switch (FuncCode)
{
case 0x03: //if (((tailRS485 - headRS485 < 9) && (tailRS485 > headRS485)) || (headRS485 - tailRS485 > RqueueRS485_Length - 9)) break;
//else RS485operate03();
if (headRS485 > tailRS485 && headRS485 - tailRS485 <= RqueueRS485_Length - 9 || tailRS485 - headRS485 >= 9)
RS485operate03();
break;
case 0x7B:
if (headRS485 > tailRS485 && headRS485 - tailRS485 <= RqueueRS485_Length - 7 || tailRS485 - headRS485 >= 7)
RS485operate123();
break;
case 0x7D:
RS485operate125();
break;
case 0x7E:
RS485operate126();
break;
case 0x7F: //if(((tailRS485 - headRS485 < 11) && (tailRS485 > headRS485)) || (headRS485 - tailRS485 > RqueueRS485_Length - 11)) break;//waitflag = on;
//else RS485operate127();
if (headRS485 > tailRS485 && headRS485 - tailRS485 <= RqueueRS485_Length - 11 || tailRS485 - headRS485 >= 11)
RS485operate127();
break;
default: RS485MoveHead(1);// 处理头指针位置,舍弃刚才头指针指向的这一帧
break;
}
}
else RS485MoveHead(1);// 从站地址既不是广播地址,也不是本站地址的情况,处理头指针位置,head指向功能码
}
//P3OUT &= ~BIT6;
}
///////////////////////////////////////////////////////////////////////////
//接收中断服务程序USART1
///////////////////////////////////////////////////////////////////////////
interrupt[UART0RX_VECTOR] void USART0_RX(void)
{
_DINT();
*tailRS485 = RXBUF0;// 接收缓存的值赋给循环队列尾指针对应的位置
toffsetRS485 = RS485offset(toffsetRS485, 1, RqueueRS485_Length);
tailRS485 = origRS485 + toffsetRS485;// 完成尾指针加1的功能
_EINT();
}
///////////////////////////////////////////////////////////////////////////
//发送中断服务程序(wjg, 2003.3.21修改)
///////////////////////////////////////////////////////////////////////////
interrupt[UART0TX_VECTOR] void USART0_TX(void)
{
_DINT();
if (++numberRS485 <tlengthRS485)
{
TXBUF0 = TqueueRS485[numberRS485];
}
else
{
IE1 &= ~UTXIE0;
}
_EINT();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -