📄 commrs232.c
字号:
** 函数名称: void Rs232CommSendWordWithChk(uint16 Commword)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月10日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Rs232CommSendWordWithChk(uint16 Commword)
{
Rs232CommSendByteWithChk((uint8)(Commword>>8));
Rs232CommSendByteWithChk((uint8)(Commword));
}
/********************************************************************************************************
** 函数名称: void soft_rs232_interrupt( void )
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void soft_rs232_interrupt( void )
{
/************************ 接收 ****************************/
if (rs_f_RI_enable == 1)
{
if (rs_shift_count == 0) //移位计数器==0, 表示检测到起始位的起点
{
if ( rs_RXD == 1 )
{
soft_receive_enable (); //起始位错, 从新开始
}
else
{
//下次中断在数据位或停止位中的某时刻发生
rs_timerL += rs_FULL_BIT_L;// + 0x10;
rs_timerH = rs_FULL_BIT_H;
rs_shift_count++;
rs_BUF = 0; //清移位缓冲变量
}
}
else
{
rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生
rs_timerH = rs_FULL_BIT_H;
rs_shift_count++; //2--9:数据位 10:停止位
if ( rs_shift_count == 9)
{
rs_BUF = rs_BUF >> 1; //接收第8位
rs_BUF_bit7 = rs_RXD;
Rs232CommTemp0 = rs_BUF;
if(Rs232CommTemp0 == 0x7E)
{
Rs232CommState = 0;
Rs232CommAscii = 0;
Rs232CommBytehilow = 0;
}
if(Rs232CommState != 0 && Rs232CommState != 5 && Rs232CommState != 6)
{
Rs232ComCalculChkSum += Rs232CommTemp0;
}
if(Rs232CommState != 0 && Rs232CommState != 6)
{
if(Rs232CommAscii == 0)
{
Rs232CommAscii = 1;
Rs232CommTemp1 = Rs232CommTemp0;
if(Rs232CommTemp1 < 0x3a)
Rs232CommTemp1 -= 0x30;
else
Rs232CommTemp1 -= 0x37;
}
else
{
Rs232CommAscii = 0;
if(Rs232CommTemp0 < 0x3a)
Rs232CommTemp0 -= 0x30;
else
Rs232CommTemp0 -= 0x37;
Rs232CommTemp1 <<= 4;
Rs232CommTemp1 |= Rs232CommTemp0;
}
}
if(Rs232CommAscii == 0)
{
switch(Rs232CommState)
{
case 0: /*SOI*/
{
if(Rs232CommTemp0 == 0x7e)
{
Rs232CommState++;
Rs232ComCalculChkSum = 0;
}
}break;
case 1: /*ADD*/
{
if(Rs232CommTemp1 == (uint8)(ModeSysConfig[8])) //BoardAddress
{
Rs232CommState++;
}
else
{
Rs232CommState = 0;
}
}break;
case 2: /*CID*/
{
Rs232CommCid = Rs232CommTemp1;
Rs232CommState++;
if(CommCid > 0x10) Rs232CommState = 0;
}break;
case 3: /*LENGTH*/
{
if(Rs232CommBytehilow == 0 )
{
Rs232CommLengthH = Rs232CommTemp1;
Rs232CommBytehilow = 1;
}
else
{
Rs232CommState++;
Rs232CommLengthL = Rs232CommTemp1;
Rs232CommBytehilow = 0;
if(Rs232CommLengthL > 40) Rs232CommState = 0;
ReceivePoint = 0; //RxBufPointer
if(Rs232CommLengthL == 0) Rs232CommState++;
}
}break;
case 4: /*INFO*/
{
if(Rs232CommLengthL != 0)
{
rs232buffer[ReceivePoint] = Rs232CommTemp1;
ReceivePoint++;
Rs232CommLengthL--;
Rs232CommLengthL--;
if(Rs232CommLengthL == 0) Rs232CommState++;
}
else
Rs232CommState++;
}break;
case 5: /*chksum*/
{
if(Rs232CommBytehilow == 0)
{
Rs232CommChksumH = Rs232CommTemp1;
Rs232CommBytehilow = 1;
}
else
{
Rs232CommBytehilow = 0;
Rs232CommChksumL = Rs232CommTemp1;
//Rs232ReComCalculChkSum = Rs232CommChksumH;
//COMEN = CommTxden;
//Suart_Send_Byte(Rs232CommChksumH);
//Rs232ReComCalculChkSum = Rs232ReComCalculChkSum << 8;
//Rs232ReComCalculChkSum |= Rs232CommChksumL;
Rs232ComCalculChkSum = (~Rs232ComCalculChkSum)+1;
//COMEN = CommTxden;
//Suart_Send_Byte(Rs232CommChksumL);
//COMEN = CommTxden;
//Suart_Send_Byte(Rs232ComCalculChkSum>>8);
//Suart_Send_Byte(Rs232ComCalculChkSum);
//if(Rs232ReComCalculChkSum == Rs232ComCalculChkSum)
if(Rs232CommChksumH == (Rs232ComCalculChkSum >> 8)
&&(Rs232CommChksumL == (uint8)(Rs232ComCalculChkSum)))
{
Rs232CommState++;
//RunLed = ~RunLed;
}
else
{
// COMEN = CommTxden;
// Suart_Send_Byte(Rs232ReComCalculChkSum>>8);
// Suart_Send_Byte(Rs232ReComCalculChkSum);
// COMEN = CommTxden;
// Suart_Send_Byte(Rs232ComCalculChkSum>>8);
// Suart_Send_Byte(Rs232ComCalculChkSum);
goto comrxend;
}
}
}break;
case 6: /*EOI */
{
if(Rs232CommTemp0 == 0x0D)
{
Rs232Massageflag = 1;
//RunLed = ~RunLed;
}
Rs232CommState = 0;
}break;
}
comrxend:
;
}
// if( ReceivePoint < rs_RECEIVE_MAX)
// { //保存收到的字节
// rs232buffer[ReceivePoint++] = rs_BUF;
// }
// else
// {
// rs_f_RI_enable = 0; //缓冲区满, 禁止接收
// }
}
else
{
if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7
{
rs_BUF = rs_BUF >> 1;
rs_BUF_bit7 = rs_RXD;
}
else
{ //收到停止位,继续检测 PC 机发出的下一个起始位
soft_receive_init();
}
}
}
TCON_TFx = 0; //清定时器中断标志
}
else
{
/************************ 发送 ****************************/
if (rs_f_TI_enable == 1)
{
rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻
rs_timerH = rs_FULL_BIT_H;
rs_shift_count--; //0:停止位末尾时刻到
//1:发送停止位
//2--9:发送数据位
if (rs_shift_count > 9) //错误状态
{
rs_shift_count = 9;
rs_BUF = 0xFF;
}
if (rs_shift_count > 1) //2--9:发送数据位
{
ACC = rs_BUF;
ACC = ACC >> 1;
rs_TXD = CY;
rs_BUF = ACC;
}
else
{
if (rs_shift_count == 0) //0:停止位末尾时刻到
{
rs_TXD = 1;
rs_f_TI = 1; //已发送完毕一个字节
}
else
{
rs_TXD = 1; //1:发送停止位
}
}
}
}
}
/********************************************************************************************************
** 函数名称: void rs232_commright(void)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void rs232_commright(void)
{
rs_send_byte(0x7E); //报文头
Rs232ComCalculChkSum = 0;
Rs232CommSendByteWithChk((uint8)(ModeSysConfig[8])); //BoardAddress地址范围0~16
Rs232CommSendByteWithChk(Rs232CommCid); //CID 07
Rs232CommSendWordWithChk(0xA006); //LENTH
Rs232CommSendByteWithChk(0x01); //
Rs232CommSendWordWithChk(0x0001); //写系数正确
Rs232ComCalculChkSum = (~Rs232ComCalculChkSum)+1;
Rs232CommSendByteWithoutChk((uint8)(Rs232ComCalculChkSum>>8));
Rs232CommSendByteWithoutChk((uint8)(Rs232ComCalculChkSum));
rs_send_byte(0x0D);
while (rs_f_TI == 0); //等待最后一个字节发送完毕
}
/********************************************************************************************************
** 函数名称: void rs232_commwrong(void)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void rs232_commwrong(void)
{
rs_send_byte(0x7E); //报文头
Rs232ComCalculChkSum = 0;
Rs232CommSendByteWithChk((uint8)(ModeSysConfig[8])); //BoardAddress地址范围0~16
Rs232CommSendByteWithChk(Rs232CommCid); //CID 07
Rs232CommSendWordWithChk(0xA006); //LENTH
Rs232CommSendByteWithChk(0x01); //
Rs232CommSendWordWithChk(0x0000); //写系数错误
Rs232ComCalculChkSum = (~Rs232ComCalculChkSum)+1;
Rs232CommSendByteWithoutChk((uint8)(Rs232ComCalculChkSum>>8));
Rs232CommSendByteWithoutChk((uint8)(Rs232ComCalculChkSum));
rs_send_byte(0x0D);
while (rs_f_TI == 0);
}
/********************************************************************************************************
** 函数名称: void Comm_rs232_handshake(void)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Comm_rs232_handshake(void)
{
rs_send_byte(0x7E); //报文头
Rs232ComCalculChkSum = 0;
Rs232CommSendByteWithChk((uint8)(ModeSysConfig[8])); //BoardAddress地址范围0~16
Rs232CommSendByteWithChk(Rs232CommCid); //CID 01
Rs232CommSendWordWithChk(0xA006); //LENTH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -