7843|11

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

Cortex-m3 UART为什么无法接收数据? [复制链接]

请教一下:M3出口通信为什么无法收到数据呢?但是可以发数据的。

下面是我的程序:

//
//UART0 inint
void UART0_Inint()
{
 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//enable Port A
 SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//enable UART0 CLOCK
 GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_1|GPIO_PIN_0);//SET GPIO WORKED AS UART MODE
 UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),9600,UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE);
 //cofigurate the UART
 //baud rate is 9600
 //data length is 8 bit
 //one stop bit
 //none parity bit
// UARTFIFOEnable(UART0_BASE);
 UARTIntEnable(UART0_BASE,UART_INT_RT|UART_INT_RX);//set uart interrupt as receive and receive timeout interrupt
 UARTEnable(UART0_BASE);//enable uart0
 IntEnable(INT_UART0);//enable uart0 interrupt   
}
中断服务函数:

void UART0InterruptHandler()
{
 PC5_1;//灯亮 作为指示
 PD7_1;
 SysCtlDelay(0xffffff);
 UARTIntClear(UART0_BASE,UART_INT_RT|UART_INT_RX);//clear interrupt flag
 if(UARTCharsAvail(UART0_BASE))//judge if UART has received data
 {
  UARTCharPutNonBlocking(UART0_BASE,UARTCharGetNonBlocking(UART0_BASE));
 } 
}

使用串口调试助手时,只有在复位的时候串口调试助手能收到00的数据,然后手动发送就不行了。

但是我把发送数据的函数放在主函数中直接调用就可以,说明发送是没问题的,应该是接受端出了问题。

请哪位大哥哥大姐姐帮忙解答一下哈,小弟感激不尽!

最新回复

楼上说得对,产生了接受中断,肯定是能接收到的,楼主可以看看设备管理器里串口参数的配置是否正确。  详情 回复 发表于 2011-10-8 16:42
 
点赞 关注

回复
举报

13

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

串口调试工具:

大幅.JPG (46.29 KB, 下载次数: 0)

大幅.JPG
 
 

回复

1万

帖子

16

TA的资源

版主

板凳
 

是不是中断相量又没设啊?

 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

2751

帖子

0

TA的资源

裸片初长成(初级)

4
 

原帖由 ddllxxrr 于 2011-10-7 14:11 发表

 

有可能

debug一下,看能不能进入中断撒。

 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

5
 

可以经中断啊,如果我把中断中的发送函数UARTCharPutNonBlocking(UART0_BASE,UARTCharGetNonBlocking(UART0_BASE))

改写成UARTCharPutNonBlocking(UART0_BASE,0x90);就是任意发送确定的数值时,单片机就会不停地发送。

 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

6
 

回复 5楼 bruthroc 的帖子

确定硬件没有问题,试试 StellarisWare 中的 uart-echo 例程。
晶振该位与板子相符。
 
 
 

回复

2751

帖子

0

TA的资源

裸片初长成(初级)

7
 

原帖由 bruthroc 于 2011-10-7 17:58 发表 可以经中断啊,如果我把中断中的发送函数UARTCharPutNonBlocking(UART0_BASE,UARTCharGetNonBlocking(UART0_BASE)) 改写成UARTCharPutNonBlocking(UART0_BASE,0x90);就是任意发送确定的数值时,单片机就会不停地发送 ...

 

那就定义一个中间变量,进入中断之后,把数据读出来UART0_BASE,UARTCharGetNonBlocking(UART0_BASE),然后再UARTCharPutNonBlocking发出去试试。

会不会是因为标志位那些给清零了的原因咧?

 
 
 

回复

299

帖子

0

TA的资源

纯净的硅(高级)

8
 

  1. //*****************************************************************************
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "grlib/grlib.h"

    //*****************************************************************************
    //
    //! \addtogroup example_list
    //! <h1>UART Echo (uart_echo)</h1>
    //!
    //! This example application utilizes the UART to echo text. The first UART
    //! (connected to the FTDI virtual serial port on the evaluation board) will be
    //! configured in 115,200 baud, 8-n-1 mode. All characters received on the
    //! UART are transmitted back to the UART.
    //
    //*****************************************************************************

    //*****************************************************************************
    //
    // The error routine that is called if the driver library encounters an error.
    //
    //*****************************************************************************
    #ifdef DEBUG
    void
    __error__(char *pcFilename, unsigned long ulLine)
    {
    }
    #endif

    //*****************************************************************************
    //
    // The UART interrupt handler.
    //
    //*****************************************************************************
    void
    UARTIntHandler(void)
    {
    unsigned long ulStatus;

    //
    // Get the interrrupt status.
    //
    ulStatus = UARTIntStatus(UART0_BASE, true);

    //
    // Clear the asserted interrupts.
    //
    UARTIntClear(UART0_BASE, ulStatus);

    //
    // Loop while there are characters in the receive FIFO.
    //
    while(UARTCharsAvail(UART0_BASE))
    {
    //
    // Read the next character from the UART and write it back to the UART.
    //
    UARTCharPutNonBlocking(UART0_BASE,
    UARTCharGetNonBlocking(UART0_BASE));
    }
    }

    //*****************************************************************************
    //
    // Send a string to the UART.
    //
    //*****************************************************************************
    void
    UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
    {
    //
    // Loop while there are more characters to send.
    //
    while(ulCount--)
    {
    //
    // Write the next character to the UART.
    //
    UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);
    }
    }

    //*****************************************************************************
    //
    // This example demonstrates how to send a string of data to the UART.
    //
    //*****************************************************************************
    int
    main(void)
    {
    tRectangle sRect;

    //
    // Set the clocking to run directly from the crystal.
    //
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHZ);

    //
    // Enable the (non-GPIO) peripherals used by this example. PinoutSet()
    // already enabled GPIO Port A.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    //
    // Enable processor interrupts.
    //
    IntMasterEnable();

    //
    // Set GPIO A0 and A1 as UART pins.
    //
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    //
    // Configure the UART for 115,200, 8-N-1 operation.
    //
    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
    (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
    UART_CONFIG_PAR_NONE));

    //
    // Enable the UART interrupt.
    //
    IntEnable(INT_UART0);
    UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);

    //
    // Prompt for text to be entered.
    //
    UARTSend((unsigned char *)"Enter text: ", 12);

    //
    // Loop forever echoing data through the UART.
    //
    while(1)
    {
    }
    }
复制代码

 

可以试试这个代码。

 
 
 

回复

242

帖子

0

TA的资源

纯净的硅(中级)

9
 

原帖由 bruthroc 于 2011-10-7 17:58 发表 可以经中断啊,如果我把中断中的发送函数UARTCharPutNonBlocking(UART0_BASE,UARTCharGetNonBlocking(UART0_BASE)) 改写成UARTCharPutNonBlocking(UART0_BASE,0x90);就是任意发送确定的数值时,单片机就会不停地发送 ...

 

这个时候上位机接收到的是0x90吗?

[ 本帖最后由 guguo2010 于 2011-10-8 12:08 编辑 ]
 
个人签名以摆脱无知为起点,以力求专业为目标
 
 

回复

1万

帖子

16

TA的资源

版主

10
 

中断没问题就是你的接收部分没有或有问题,只发不收,呵呵

 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

299

帖子

0

TA的资源

纯净的硅(高级)

11
 

回复 10楼 ddllxxrr 的帖子

如果收不到,怎么能进入中断?
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

12
 

回复 11楼 永远的不知 的帖子

楼上说得对,产生了接受中断,肯定是能接收到的,楼主可以看看设备管理器里串口参数的配置是否正确。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表