如题,在多字节发送时有问题。测试代码如下: #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中关闭了接收,为什么还出现这个情况? |
从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
回复:STM8S003F3 串口多字节发送问题
void UART1_SendChar(u8 data)
{
// while((UART1_SR & 0x80) == 0x00);
// UART1_DR = data;
while((UART1_SR & 0x80) == 0x00); // 若发送寄存器不空,则等待
UART1_CR2 = 0x00;
UART1_DR = data; // 将要发送的字符送到数据寄存器
UART1_CR2 = 0x08;
while((UART1_SR & 0x40) ==0);//发送是否完成
}
RE:STM8S003F3 串口多字节发送问题
回复:STM8S003F3 串口多字节发送问题
我刚才测试了一下,关闭中断以后,是不会进入接收中断程序的,这更让我想不明白了。
中断关了,当然不会进接收中断了、、
回复:STM8S003F3 串口多字节发送问题
回复第 3 楼 于2014-05-17 09:31:53发表:
我刚才测试了一下,关闭中断以后,是不会进入接收中断程序的,这更让我想不明白了。
中断关了,当然不会进接收中断了、、
求解,这是什么原因啊?
RE:STM8S003F3 串口多字节发送问题
CR2 中的bit2 and bit3 在初始化时直接使能,发送和接收会有问题吗?
if(iIndex > 5)
{
UART1_CR2 = 0x08;
iIndex = 0;
flag = 0;
flag1 = 1;
} 中的 >是什么意思?