📄 serial.c
字号:
#include "config.h"
#include <stdio.h>
#include "io.h"
#include "global.h"
#include "event.h"
#include "78e516.h"
U8 lrc;
/*
函数 设定波特率
波特率 = 震荡频率(18.432M)/(32*(65536-[RCAP2H,RCAP2L]))
*/
void SetBaudRate(U8 baudrate)
{
U16 code baudtbl[] = {-60,-30,-15,-10,-5};
THL2 = RCAP2 = baudtbl[baudrate];
}
/*
函数 往串口发送一个字符
输入 value 要发送的字符
*/
void put_buf(U8 value)
{
// 等待缓冲区有空间
while (((TxWrite + 1) & 0x0f) == TxRead)
{
}
TxBuffer[TxWrite] = value;
TxWrite = (TxWrite + 1) & 0x0f;
lrc = lrc ^ value;
if (TxEmpty == 1)
{
TxEmpty = 0;
TI = 1;
}
// TxEmpty = 0;
// SBUF = value;
// lrc = lrc ^ value;
// while(TxEmpty == 0);
}
/*
函数 串口通讯的处理程序
*/
U8 CheckSerial(void)
{
U8 i,checkl;
if (RxBusy == 0) return(0xff);
// 接收到通讯数据包
if (RxCount == 0)
{
RxBusy = 0;
return(0xff);
}
if (RxCount == 1)
{
RxBusy = 0;
RxCount = 0;
return(RxBuffer[0]);
}
if (RxBuffer[0] == 3)
{
checkl = 0;
for (i=0; i<RxCount; i++)
{
checkl = checkl ^ RxBuffer[i];
}
if (checkl == 0)
{
// 接收到正确的数据包
switch(RxBuffer[1])
{
case '0': // 设定波特率
put_buf(2);
put_buf(0);
SetBaudRate(RxBuffer[2]);
break;
case '4': // 通讯测试
checkl = 0x01;
for (i=0; i<8; i++)
{
if (RxBuffer[6+i] != checkl) break;
checkl *= 2;
}
if (checkl == 0)
{
RxBuffer[0] = 3;
RxBuffer[1] = '4';
checkl = 0x80;
for (i=0; i<8; i++)
{
RxBuffer[6+i] = checkl;
checkl /= 2;
}
lrc = 0;
for (i=0; i<14; i++)
{
put_buf(RxBuffer[i]);
}
put_buf(lrc);
}
break;
case 0x3f:
put_buf(2);
put_buf(0);
while(TxEmpty == 0);
EnterISP();
break;
}
}
}
RxCount = 0;
RxBusy = 0;
return(0xff);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -