打印
[STM32F1]

STM32串口通信问题

[复制链接]
1958|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 | 只看该作者
即使你主函数已经写了发送字符串的函数了,但是你在中断处理中并没有引用。

使用特权

评论回复
5
chuxh| | 2021-4-8 23:49 | 只看该作者
代码没写对

使用特权

评论回复
6
huanghuac| | 2021-4-8 23:52 | 只看该作者
建议加个标志位,当接收到a时,给标志位置1,

使用特权

评论回复
7
dingy| | 2021-4-8 23:53 | 只看该作者
然后在主函数里判断,当那个标志位=1时,往串口发送字符串。

使用特权

评论回复
8
午夜粪车| | 2021-4-8 23:55 | 只看该作者
加个标志位和接受超时,这样不容易出错。

使用特权

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

使用特权

评论回复
10
wenfen| | 2021-4-8 23:58 | 只看该作者
直接使用串口空闲中断就可以了

使用特权

评论回复
11
chenjun89| | 2021-4-9 08:54 | 只看该作者
时序不对

使用特权

评论回复
12
呐咯密密| | 2021-4-9 09:30 | 只看该作者
问问题要描述清楚啊,你用的DMA是接收和发送都用了吗?你说你只能接收到一个数据,那你原来应该接收几个,你的DMA发送或者接收的代码在哪里,就贴一个中断函数看不出来啊,而且从贴的中断函数来看,第一,没用到DMA,第二,你就发送了一个字节。

使用特权

评论回复
13
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被置起时,一帧数据传输完成
}
}

使用特权

评论回复
14
zhuhuis| | 2021-4-12 17:32 | 只看该作者
可以实现的。

使用特权

评论回复
15
tian111| | 2021-4-12 17:34 | 只看该作者
主函数中的发送函数怎么没被调用啊?

使用特权

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

使用特权

评论回复
17
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;
            
             }
}

使用特权

评论回复
18
zwll| | 2021-4-12 17:39 | 只看该作者
你的代码本身就是一个字符发送的啊

使用特权

评论回复
19
yszong| | 2021-4-12 17:40 | 只看该作者
循环发送呀,一次只能发送一个字节

使用特权

评论回复
20
jiahy| | 2021-4-12 17:42 | 只看该作者
本来就是这样子的啊

使用特权

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

本版积分规则

712

主题

7557

帖子

1

粉丝