打印

stm32串口的问题,不能接收

[复制链接]
5160|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
love001cool|  楼主 | 2012-6-11 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想在C#里面编个程序,用串口发送16进制数据到stm32上,显示为16进制或者10进制,搞了好久了还是不行 啊,
单片机里面接收的是单个字符,是我的数组设置有问题吗,还是发送有问题啊?求救


u32 i=0;

extern unsigned char Re[0xFF];

void USART1_IRQHandler(void)
{
  if(USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET)
  {
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);

    //将每个字符接受过来放在数组Re里面
    Re[i++] = (USART_ReceiveData(USART1) & 0x7F);

    //USART_SendData(USART1,Re[j++]);
  }
沙发
love001cool|  楼主 | 2012-6-11 22:32 | 只看该作者
附加:
stm32能直接接收16进制数吗??

使用特权

评论回复
板凳
yirongfu| | 2012-6-11 23:55 | 只看该作者
本帖最后由 yirongfu 于 2012-6-11 23:57 编辑

如果STM32收到数据了,也就是你说的“单个字符”,那我觉得硬件和STM32内的程序应该基本没问题,估计还是你的PC端C#程序有问题。
串口收发的数据流是二进制,0和1。16和10进制实际上对于数据收发通道来说没有意义,它们只是人为对二进制码串的编码,不存在只能接收16进制或者10进制数的说法。而PC端的高级编程语言,在处理与单片机的通讯时,就需要加以区分,因为PC端显示的内容是字符,底层发送时被转换成ASCII码了,或许你的问题出在这里。
你可以用调试工具查看一下PC发出的数据内容。

使用特权

评论回复
地板
sjnh| | 2012-6-12 08:11 | 只看该作者
void USART1_IRQHandler(void)
{
  if(USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET)
  {
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);

    //将每个字符接受过来放在数组Re里面
    Re[i++] = (USART_ReceiveData(USART1) & 0x7F);

    //USART_SendData(USART1,Re[j++]);
  }

使用特权

评论回复
5
jgphu| | 2012-6-12 10:09 | 只看该作者
楼主你太牛了。 查询发送完成状态值。清的是接收寄存器不为空。

使用特权

评论回复
6
love001cool|  楼主 | 2012-6-12 10:34 | 只看该作者
void USART1_IRQHandler(void)
{
  if(USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET)
  {
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);

    //将每个字符接受过来放在数组Re里面
    Re = (USART_R ...
sjnh 发表于 2012-6-12 08:11


void USART1_IRQHandler(void)
{
  //检查指定的USART标志位设置与否
  //USART_FLAG_RXNE——接收数据寄存器非空标志位
  if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
  {
    m= USART_ReceiveData(USART1);
    s1[i++]=USART_ReceiveData(USART1);

    USART_SendData(USART1,m);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  }

  //检查指定的USART中断发生与否
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  }
}

改了,现在用串口调试助手,发了AB,接收的是2B呢
该了

使用特权

评论回复
7
love001cool|  楼主 | 2012-6-12 10:35 | 只看该作者
楼主你太牛了。 查询发送完成状态值。清的是接收寄存器不为空。
jgphu 发表于 2012-6-12 10:09


呵呵,写错了,现在改成6楼的形式了,还是不对啊

使用特权

评论回复
8
jgphu| | 2012-6-12 14:45 | 只看该作者
初始化只接收中断。

void USART1_IRQHandler(void)
{
     uint16_t m;

     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
          m= USART_ReceiveData(USART1);
          USART_SendData(USART1,m);
         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }
}

如果这样还不行的话。用示波器看一下波特率是否发送和接收一致。(是否程序还有别的问题  GPIO初始化,GPIO时钟,外设时钟)

使用特权

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

本版积分规则

0

主题

19

帖子

0

粉丝