打印
[应用相关]

STM32串口通信问题

[复制链接]
1324|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ousj|  楼主 | 2019-4-20 18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口通信的问题,采用DMA的通信方式,在中断函数中处理收发数据,但是为什么发送和接收数据只能是一个字符呢?
中断程序如下:
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断为接收中断
  {
  USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除中断标志
  if(USART_ReceiveData(USART1)=='a'){
  USART_SendData(USART1,'A'); //发送数据

使用特权

评论回复
沙发
wenfen| | 2019-4-20 18:29 | 只看该作者
你写的 只是一个发送文字符的一个程序 应该写成 字符串的
void USART1_PutString(char *str)
{
        while(*str != '\0')
        {
                USART1_PutChar(*str++);
        }
}

使用特权

评论回复
板凳
gongche| | 2019-4-22 18:22 | 只看该作者
从代码上看,你的代码功能就是当接收到a时,发送个A,都是一个字符。

使用特权

评论回复
地板
huwr| | 2019-4-22 18:26 | 只看该作者
即使你主函数已经写了发送字符串的函数了,但是你在中断处理中并没有引用。

使用特权

评论回复
5
zhuotuzi| | 2019-4-22 18:27 | 只看该作者
代码没写对

使用特权

评论回复
6
zhuotuzi| | 2019-4-22 18:27 | 只看该作者
代码没写对

使用特权

评论回复
7
huanghuac| | 2019-4-22 18:30 | 只看该作者

建议加个标志位,当接收到a时,给标志位置1,
然后在主函数里判断,当那个标志位=1时,往串口发送字符串。

使用特权

评论回复
8
午夜粪车| | 2019-4-22 18:34 | 只看该作者

加个标志位和接受超时,这样不容易出错。

使用特权

评论回复
9
bqyj| | 2019-4-22 18:37 | 只看该作者
都用DMA了,你还开启串口接收中断干毛哦

使用特权

评论回复
10
wenfen| | 2019-4-22 18:41 | 只看该作者
直接使用串口空闲中断就可以了

使用特权

评论回复
11
zhuhuis| | 2019-4-22 18:44 | 只看该作者

void USART1_Puts(char *str)
{
while (*str)
{
USART_SendData(USART1, *str++);

/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //详见英文参考的521页,当TXE被置起时,一帧数据传输完成
}
}

使用特权

评论回复
12
zhuhuis| | 2019-4-22 18:44 | 只看该作者

可以实现的。

使用特权

评论回复
13
tian111| | 2019-4-22 18:47 | 只看该作者

主函数中的发送函数怎么没被调用啊?

使用特权

评论回复
14
songqian17| | 2019-4-22 18:50 | 只看该作者
在主函数里判断,当那个标志位=1时,执行发送函数?往串口发送字符串。

使用特权

评论回复
15
songqian17| | 2019-4-22 18:55 | 只看该作者
#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX_ISR(void)
{
  data[j]=U1RXBUF;
  j++;                       
IFG2&=0XEF;                                      
}
上面的是中断程序,然后下面是主函数的执行程序
while(1)
{
if(j == 1000)
        {
          j = 0;
          crcsum = Cal_CRC16(&data[0],datalen);
            
        data[1000]=crcsum;
        data[1001]=0x1a;  
        data[1002]='\r';
        data[1003]='\n';
         
                  //发送寄存器空的时候发送数据  
        for(i=0;i<1003;i++)
            {  
              while(!(IFG1&UTXIFG0));
              U0TXBUF=data;
            
             }
}

使用特权

评论回复
16
zwll| | 2019-4-22 18:57 | 只看该作者
你的代码本身就是一个字符发送的啊

使用特权

评论回复
17
yszong| | 2019-4-22 19:01 | 只看该作者

循环发送呀,一次只能发送一个字节

使用特权

评论回复
18
ousj|  楼主 | 2019-4-22 19:05 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈,结贴了先

使用特权

评论回复
19
paotangsan| | 2019-5-10 10:24 | 只看该作者
本来就是这样子的啊

使用特权

评论回复
20
renzheshengui| | 2019-5-10 10:26 | 只看该作者
二楼写的很正确

使用特权

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

本版积分规则

712

主题

7557

帖子

1

粉丝