打印
[技术问答]

N76E003 串口接收问题

[复制链接]
1994|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yunxiang521|  楼主 | 2019-6-6 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
N76E003 8位是不是串口接收每次只能接收一个字符,多字符就会出现乱码。
#include "N76E003.h"
#include "SFR_Macro.h"
#include "Common.h"
#include "Delay.h"
#include "Function_define.h"

#define BUFFER_SIZE                16
UINT8  UART_BUFFER[BUFFER_SIZE],temp;
UINT16 u16CNT=0,u16CNT1=0;
bit riflag;


/**
* FUNCTION_PURPOSE: serial interrupt, echo received data.
* FUNCTION_INPUTS: P0.7(RXD) serial input
* FUNCTION_OUTPUTS: P0.6(TXD) serial output
*/
void SerialPort0_ISR(void) interrupt 4
{
    if (RI==1)
    {                                       /* if reception occur */
        clr_RI;                             /* clear reception flag for next reception */
        UART_BUFFER[u16CNT] = SBUF;
                          u16CNT ++;
                                riflag =1;
    }
    if(TI==1)
    {
        clr_TI;                             /* if emission occur */
    }
}

/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main (void)
{
                P12_PushPull_Mode;
                P06_Quasi_Mode;
                P07_Quasi_Mode;
          InitialUART0_Timer1(115200);            /* 115200 Baud Rate from timer1*/
                SCON = 0xD0;                        // Special setting the mode 3 and 0xD0
                TMOD |= 0x20;            //Timer1 Mode1
   
    set_SMOD;                //UART0 Double Rate Enable
    set_T1M;
    clr_BRCK;                //Serial port 0 baud rate clock source = Timer1
                TH1 = 256 - (1000000/115200+1);               /*16 MHz */
                //TH1 = 256 - (1037500/38400);                /*16.6 MHz */
          set_TR1;
       
                set_RB8;                                        //This bit is for setting the stop bit 2 high/low status,
       
                clr_TI;
    set_ES;           //enable UART interrupt 启用串口中断
    set_EA;           //enable global interrupt 启用全局中断

    while(1)
                {
                        if (riflag)
                        {
                                P12 = ~P12;                //In debug mode check UART_BUFFER[u16CNT] to check receive data
                                temp = SBUF;        //This part send the receive data from RXD to TXD
                                Send_Data_To_UART0(temp);
                                Send_Data_To_UART0(0x5c);
                                Send_Data_To_UART0(0x6e);
                                Send_Data_To_UART0(0x00);
                                Send_Data_To_UART0(0x48);
                                Send_Data_To_UART0(0x65);
                                Send_Data_To_UART0(0x6c);
                                Send_Data_To_UART0(0x6c);
                                Send_Data_To_UART0(0x6f);
                                riflag = 0;
                               
                                //u16CNT = 0;
                        }

使用特权

评论回复
沙发
yunxiang521|  楼主 | 2019-6-6 17:28 | 只看该作者
我用官方的示例代码,每次只接收第一个字符是对的。有没能办法接收字符串,有没有大牛给个例子

使用特权

评论回复
板凳
yunxiang521|  楼主 | 2019-6-6 17:55 | 只看该作者
现在使用字符拼接的方法,是可以成为字符串,效率太差,有没有其它方法。

使用特权

评论回复
地板
yunxiang521|  楼主 | 2019-6-7 13:22 | 只看该作者
自己找到了问题所在,
        TH1 = 256 - (1000000/115200+1);               /*16 MHz */
关键是这行代码。115200改成9600 就可以了,还有缓存区BUFFER_SIZE16位, 超过字符还是会出现乱码,可以每次接收字符串后把u16CNT清0 如果要发送的字条很长,试着把值设置大一些。我的16位够用了。这个问题折腾了三天。

使用特权

评论回复
5
jasontu| | 2019-6-10 08:02 | 只看该作者
改baudrate只是讓你的收資料變慢。
8051 tx rx共用一個buf,不能同時作傳收

使用特权

评论回复
6
dongnanxibei| | 2019-6-13 23:58 | 只看该作者
说明时钟和波特率没有配置对

使用特权

评论回复
7
ynl02010| | 2020-9-2 10:05 | 只看该作者
楼主,你的问题解决了吗?小弟也遇到了同样的问题,能不能分享一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

100

帖子

0

粉丝