在线时间8 小时
UID2077149
ST金币0
蝴蝶豆0
注册时间2014-3-5
初级会员
- 最后登录
- 2018-6-19
|
a0a.1 0b0c
如题,在多字节发送时有问题。测试代码如下:
#include "STM8S003F3P.h"
u8 RxData[10] = {0};
u8 iIndex;
_Bool flag;
_Bool flag1;
main()
{
// System_Config();
u8 i;
Clk_Init();
Uart1_Init(2);
iIndex =0;
flag = 0;
flag1 = 0;
_asm("rim"); // 开中断
while (1)
{
if(flag1)
{
// delay(8000);
for(i = 0;i < 10;i++)
{
UART1_SendChar(RxData);
}
delay1s();
for(i = 0;i < 10;i++)
{
UART1_SendChar(RxData);
}
flag1 = 0;
UART1_CR2 = 0x2c;
}
}
}
// 函数功能:UART1的接收中断服务程序
// 输入参数:无
// 输出参数:无
// 返 回 值:无
@far @interrupt void UART1_Recv_IRQHandler (void)
{
u8 DataTemp; // 数据缓冲
DataTemp = UART1_DR;
if(flag == 0)
{
if(DataTemp == 0x01)
{
flag = 1;
RxData[0] = DataTemp;
iIndex = 1;
}
}
else
{
RxData[iIndex] = DataTemp;
iIndex++;
if(iIndex > 5)
{
UART1_CR2 = 0x08;
iIndex = 0;
flag = 0;
flag1 = 1;
}
}
return;
}
//以上是主函数
串口初始化:
void Uart1_Init(u8 UartBPS)
{
UART1_CR1 = 0x14; // 9位数据,偶校验
//UART1_CR1 = 0x00; // 8位数据,无校验
UART1_CR2 = 0x00;
UART1_CR3 = 0x00; // 編程停止位位數
// 设置波特率,必须注意以下几点:
// (1) 必须先写BRR2
// (2) BRR1存放的是分频系数的第11位到第4位,
// (3) BRR2存放的是分频系数的第15位到第12位,和第3位
// 到第0位
// 例如对于波特率位9600时,分频系数=16 000 000/9600 = 208
// 38400 时 16 000 000 / 38400 = 417
// 对应的十六进制数为00D0,BBR1=0D,BBR2=00
// 例 0683 68 03
// 01a1 1a 01
UART1_BRR2 = UartBPSH[0x1a];
UART1_BRR1 = UartBPSL[0xa0]; //2400bps
//9600 16M時有誤差,24M時波特率9600無誤差
//UART1_BRR2 = 0x03;
//UART1_BRR1 = 0x68;
//38400
//UART1_BRR2 = 0x01;
//UART1_BRR1 = 0x1a;
UART1_CR2 = 0x2c; // 允许接收,发送,开接收中断
//UART1_CR2 = 0x28;
}
//首先不要怀疑单片机的问题,我更换过,单字节发送接收没问题。
测试:电脑向单片机发送01 02 03 04 05 06 单片机向电脑返回的也是 01 02 03 04 05 06 00 00 00 00 01 02 03 04 05 06 00 00 00 00 这个数据没问题
发送01 02 03 04 05 06 07 08 09 0a 有问题 返回 CF 02 03 04 05 06 00 00 00 00 01 02 03 04 05 06 00 00 00 00
从上面可两个for循环返回的数据可以看出,我的接收缓存RxData的数据没有问题的。我发送的字节数越长,第一个for循环电脑接收到的数据越乱,如果我在第一个for循环发送前加上延时,接收到的数据就会好很多。我怀疑是在发送的时候又进入接收中断,这样UART1_DR的值被改变了,但是我在发送之前已经在UART1_CR2中关闭了接收,为什么还出现这个情况?
|
|