[STM32F1] STM32串口通信问题

[复制链接]
2533|31
 楼主| ousj 发表于 2021-4-8 23:39 | 显示全部楼层 |阅读模式
串口通信的问题,采用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 发表于 2021-4-8 23:41 | 显示全部楼层
你写的 只是一个发送文字符的一个程序 应该写成 字符串的
void USART1_PutString(char *str)
{
        while(*str != '\0')
        {
                USART1_PutChar(*str++);
        }
}
gongche 发表于 2021-4-8 23:43 | 显示全部楼层
从代码上看,你的代码功能就是当接收到a时,发送个A,都是一个字符。
huwr 发表于 2021-4-8 23:47 | 显示全部楼层
即使你主函数已经写了发送字符串的函数了,但是你在中断处理中并没有引用。
chuxh 发表于 2021-4-8 23:49 | 显示全部楼层
代码没写对
huanghuac 发表于 2021-4-8 23:52 | 显示全部楼层
建议加个标志位,当接收到a时,给标志位置1,
dingy 发表于 2021-4-8 23:53 | 显示全部楼层
然后在主函数里判断,当那个标志位=1时,往串口发送字符串。
午夜粪车 发表于 2021-4-8 23:55 | 显示全部楼层
加个标志位和接受超时,这样不容易出错。
bqyj 发表于 2021-4-8 23:56 | 显示全部楼层
都用DMA了,你还开启串口接收中断干毛哦
wenfen 发表于 2021-4-8 23:58 | 显示全部楼层
直接使用串口空闲中断就可以了
chenjun89 发表于 2021-4-9 08:54 来自手机 | 显示全部楼层
时序不对
呐咯密密 发表于 2021-4-9 09:30 | 显示全部楼层
问问题要描述清楚啊,你用的DMA是接收和发送都用了吗?你说你只能接收到一个数据,那你原来应该接收几个,你的DMA发送或者接收的代码在哪里,就贴一个中断函数看不出来啊,而且从贴的中断函数来看,第一,没用到DMA,第二,你就发送了一个字节。
zhuhuis 发表于 2021-4-12 17:29 | 显示全部楼层

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被置起时,一帧数据传输完成
}
}
zhuhuis 发表于 2021-4-12 17:32 | 显示全部楼层
可以实现的。
tian111 发表于 2021-4-12 17:34 | 显示全部楼层
主函数中的发送函数怎么没被调用啊?
songqian17 发表于 2021-4-12 17:35 | 显示全部楼层
在主函数里判断,当那个标志位=1时,执行发送函数?往串口发送字符串。
songqian17 发表于 2021-4-12 17:37 | 显示全部楼层

#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;
            
             }
}
zwll 发表于 2021-4-12 17:39 | 显示全部楼层
你的代码本身就是一个字符发送的啊
yszong 发表于 2021-4-12 17:40 | 显示全部楼层
循环发送呀,一次只能发送一个字节
jiahy 发表于 2021-4-12 17:42 | 显示全部楼层
本来就是这样子的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

712

主题

7557

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部