📄 rs232.c
字号:
#include "RS232.h"
WORD g_bRS232IRQEnabled = FALSE; // 是否允许 RS232 发送及接收中断
BYTE g_byRS232TXBuffer[RS232_BUFFER_LENGTH]; // 发送缓冲区
BYTE g_byRS232RXBuffer[RS232_BUFFER_LENGTH]; // 接收缓冲区
int g_nRS232TXCount = 0; // 当前发送缓冲区中的数据长度
int g_nRS232RXCount = 0; // 当前接收缓冲区中的数据长度
ISRProc g_pRS232RXIRQProc = NULL; // RS232 接收中断处理过程
ISRProc g_pRS232TXIRQProc = NULL; // RS232 接收中断处理过程
//-----------------------------------------------------------------------------
// 初始化串行通讯口
// nBaud 波特率(1200, 2400, 4800, 9600, 115200, ...)
// chParity 奇偶校验方式
// 'N': 无奇偶校验 'E': 偶校验 'O': 奇校验0
// '1': 始终为1 '0': 始终为0
// nDataBits 数据位(5, 7, 8)
// nStopBits 停止位(1, 2)
//-----------------------------------------------------------------------------
void InitRS232(int nBaud, char chParity, int nDataBits, int nStopBits)
{
unsigned uCmd = 0x02; // 接收中断
// 校验方式
switch(chParity)
{
case 'O': uCmd |= 0x20; break; // 奇校验
case 'E': uCmd |= 0x28; break; // 偶校验
case '1': uCmd |= 0x30; break; // Parity forced/checked as 1
case '0': uCmd |= 0x38; break; // Parity forced/checked as 0
case 'N': // 无校验
default:
break;
}
if (nStopBits==2) // 两位停止位
uCmd |= 0x40;
// 数据位
switch(nDataBits)
{
case 5:
break;
case 6:
uCmd |= 0x01;
break;
case 7:
uCmd |= 0x02;
break;
case 8:
default:
uCmd |= 0x03;
break;
}
rULCON0 = uCmd; // 奇偶校验、数据位、停止位
rUCON0 = 0x205; // 发送缓冲区空脉冲中断、接收缓冲区接收数据脉冲中断
// 禁止超时中断、禁止错误中断
// rUFCON0 = 0x01; // 启用 FIFO
rUFCON0 = 0x00; // 禁用 FIFO
rUMCON0 = 0x00; // 禁用流控
rUBRDIV0 = (unsigned)(MCLK/(nBaud<<4) + 0.5) - 1;
g_nRS232RXCount = 0;
g_nRS232TXCount = 0;
}
//-----------------------------------------------------------------------------
// 通过 RS232 串口读取一个字节
//-----------------------------------------------------------------------------
BYTE ReceiveByte()
{
return (BYTE)rURXH0;
}
//-----------------------------------------------------------------------------
// 通过 RS232 串口发送一个字节
//-----------------------------------------------------------------------------
void SendByte(unsigned char byData)
{
while(!(rUTRSTAT0 & 0x2)) ; // 等待发送保持寄存器空
rUTXH0 = byData; // 向发送保持寄存器写数据
}
//-----------------------------------------------------------------------------
// 通过 RS232 串口发送字符串
//-----------------------------------------------------------------------------
void SendString(char *szFormat, ...)
{
va_list vl;
char szBuffer[200];
char *pString = szBuffer;
int i = 0;
va_start(vl, szFormat);
vsprintf(szBuffer, szFormat, vl);
va_end(vl);
while((*pString) && (i<200))
{
while(!(rUTRSTAT0 & 0x2)) ; // 等待发送保持寄存器空
WrUTXH0(szBuffer[i]); // 向发送保持寄存器写数据
pString ++;
i ++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -