[技术问答]

请教新唐N76E003串口接收识别问题

[复制链接]
6979|33
手机看帖
扫描二维码
随时随地手机跟帖
sun420410089|  楼主 | 2017-4-22 15:45 | 显示全部楼层 |阅读模式
想用N76E003识别电脑的串口指令OPEN、CLOSE,作出LED-P12灯亮灭的响应目前用BSP里面的源码,只收正常收到电脑发过来的一个字节,超过一个字节就乱码了

UART0_mode_3.rar

105.4 KB

BSP里的参考源码

sun420410089|  楼主 | 2017-4-22 15:50 | 显示全部楼层
#include <stdio.h>
#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: P3.0(RXD) serial input
* FUNCTION_OUTPUTS: P3.1(TXD) serial output
*/
void serial_IT(void) interrupt 4
{
    if (RI)
    {                                       /* if reception occur */
        clr_RI;                             /* clear reception flag for next reception */
        UART_BUFFER[u16CNT] = SBUF;
        u16CNT ++;
                                riflag =1;
    }
    if(TI)
    {
        clr_TI;                             /* if emission occur */
    }
}
/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main (void)
{

   
    P06_Quasi_Mode;                                                       //Set UART GPIO are Quasi Mode
                P07_Quasi_Mode;
    InitialUART0_Timer1(115200);            /* 115200 Baud Rate from timer1*/
       
    SCON = 0xD2;                                                                                                                // Special setting the mode 3
   
    set_ES;                                 //enable UART interrupt
    set_EA;                                 //enable global interrupt
    clr_TB8;
    Send_Data_To_UART0(0x53);                                                                //Send "start" ascii code show reset initial status
          Send_Data_To_UART0(0x74);
          Send_Data_To_UART0(0x61);
          Send_Data_To_UART0(0x72);
          Send_Data_To_UART0(0x74);
       
    while(1)
                {
                        if (riflag)
                        {
                                temp = SBUF;                                                                                                //This part send the receive data from RXD to TXD
                                Send_Data_To_UART0(temp);
                                riflag = 0;
                        }
                }
       
}

使用特权

评论回复
svxuewen| | 2017-4-22 18:28 | 显示全部楼层
波特率误差太大,16M晶振设置115200波特率是有问题的

使用特权

评论回复
稳稳の幸福| | 2017-4-22 18:37 | 显示全部楼层
用9600波特率试试。

使用特权

评论回复
734774645| | 2017-4-22 19:54 | 显示全部楼层
单片机能检测对方是不是在线?不能吧,我看那个串口助手,在上电的时候没有收到什么东西啊。

使用特权

评论回复
xixi2017| | 2017-4-22 20:18 | 显示全部楼层
想实现这个功能,电脑那边必须有个上位机,检测自己串口是否打开,然后发送握手指令。

使用特权

评论回复
heisexingqisi| | 2017-4-23 15:10 | 显示全部楼层
没试过这种用法,不记得计算机上位机打开端口时候那个单片机串口收到过什么。

使用特权

评论回复
Lbsonggz| | 2017-4-23 18:01 | 显示全部楼层
收完就发系统会傻掉的,收就是收,发就是发,

使用特权

评论回复
sun420410089|  楼主 | 2017-4-24 09:16 | 显示全部楼层

试过9600,也是同样问题

使用特权

评论回复
sun420410089|  楼主 | 2017-4-24 09:17 | 显示全部楼层
734774645 发表于 2017-4-22 19:54
单片机能检测对方是不是在线?不能吧,我看那个串口助手,在上电的时候没有收到什么东西啊。 ...

我用串口助手,能收到“start”的。而且只发一个字符,PC能正常收到,发多个就乱码了

使用特权

评论回复
sun420410089|  楼主 | 2017-4-24 15:12 | 显示全部楼层
Lbsonggz 发表于 2017-4-23 18:01
收完就发系统会傻掉的,收就是收,发就是发,

这款mcu是支持异步全双工的,已经选择mode1了,应该不是这问题

使用特权

评论回复
sun420410089|  楼主 | 2017-4-24 15:14 | 显示全部楼层
#include <stdio.h>
#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;
sbit LED=P1^2;
/**
* FUNCTION_PURPOSE: serial interrupt, echo received data.
* FUNCTION_INPUTS: P3.0(RXD) serial input
* FUNCTION_OUTPUTS: P3.1(TXD) serial output
*/
void serial_IT(void) interrupt 4
{
    if (RI)
    {                                       /* if reception occur */
        clr_RI;                             /* clear reception flag for next reception */
        UART_BUFFER[u16CNT] = SBUF;
        u16CNT ++;
                                riflag =1;
    }
    if(TI)
    {
        clr_TI;                             /* if emission occur */
    }
}


/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main (void)
{

   Set_All_GPIO_Quasi_Mode;
    P06_Quasi_Mode;                                                       //Set UART GPIO are Quasi Mode
                P07_Quasi_Mode;
    InitialUART0_Timer1(9600);            /* 115200 Baud Rate from timer1*/
       
    SCON = 0xD2;                                                                                                                // Special setting the mode 3

    set_ES;                                 //enable UART interrupt
    set_EA;                                 //enable global interrupt
    clr_TB8;
    Send_Data_To_UART0(0x53);                                                                //Send "start" ascii code show reset initial status
          Send_Data_To_UART0(0x74);
          Send_Data_To_UART0(0x61);
          Send_Data_To_UART0(0x72);
          Send_Data_To_UART0(0x74);
        LED=0;
    while(1)
                {
                        if (riflag)
                        {
                                clr_ES;
                                SCON=0x40;                                //停止接收
                                temp = SBUF;                                                                                                //This part send the receive data from RXD to TXD
                                Send_Data_To_UART0(temp);
                                set_ES;                                 //enable UART interrupt
                                SCON = 0xD2;     //UART0 Mode1,REN=1,TI=1
                                riflag = 0;
                                LED=~LED;
                        }
                }       
}

使用特权

评论回复
sun420410089|  楼主 | 2017-4-24 15:16 | 显示全部楼层
在发送时,加了停止接收,发完再继续接收。发现每次只接收到奇数位的字符,偶数的字符丢失了

使用特权

评论回复
sun420410089|  楼主 | 2017-4-24 15:28 | 显示全部楼层
查看datasheet,在模式1时,是支持全双工异步模式的。为什么在发送时,接收数据会出问题?

13. 串口 控制器 (UART)
N76E003包含两个具备增强的自动地址识别和帧错误检测功能的全双工串口。由于两个串口的控制位是一样
的,为了区分两个串口控制位,串口1的控制位以“_1”结尾(例如SCON_1)。下述详例以串口0为例。
每个串口都有一种同步工作模式:模式0。三种全双工异步模式:模式1,2,和3,这意味着收发可以同时连续
进行。串口接收带有接收缓存,意味着在接收的前一个数据在被读取之前,串口就能接收第二个数据。

uart.PNG

使用特权

评论回复
Lbsonggz| | 2017-4-24 20:20 | 显示全部楼层
程序中只看到一个SBUF,你使用的串口只能工作在半双工模式。发完再收,收完再发。并且,收中断中禁止发送,发送时禁止接收,才能保证对SBUF的操作时序。

使用特权

评论回复
xia_318| | 2017-11-24 09:30 | 显示全部楼层
我也在调试串口这一块

使用特权

评论回复
heisexingqisi| | 2017-11-24 10:35 | 显示全部楼层
搞定了没,这个怎么解决?

使用特权

评论回复
qq997758497| | 2017-11-24 14:18 | 显示全部楼层
你好 楼主 请问你这个N76E003是如何下载的?我用ICP工具下载可以,但是下载官方的GPIO跳变后也没有达到效果,用keil下载直接提示失败,仿真也是不能成功

使用特权

评论回复
yiyigirl2014| | 2017-11-26 18:48 | 显示全部楼层
qq997758497 发表于 2017-11-24 14:18
你好 楼主 请问你这个N76E003是如何下载的?我用ICP工具下载可以,但是下载官方的GPIO跳变后也没有达到效果 ...

因为要用ICP工具配置关键字吧。或者Keil没有设置正确。

使用特权

评论回复
zhuotuzi| | 2018-5-12 10:01 | 显示全部楼层
可以示波器测一下晶振频率是偏大还是偏小,配置里修正一下。

使用特权

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

本版积分规则

1

主题

13

帖子

0

粉丝