打印
[STM32F4]

STM32F429探索板的串口UART1发送数据时错误(增加悬赏和代码)

[复制链接]
3600|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjben|  楼主 | 2014-4-4 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//串口初始化
void Uart_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
   
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
      
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
           
    USART_InitStructure.USART_BaudRate=4800;
    USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    USART_InitStructure.USART_Parity=USART_Parity_Odd;
    USART_InitStructure.USART_StopBits=USART_StopBits_1;
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_Init(USART1,&USART_InitStructure);
   
    NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    USART_Cmd(USART1,ENABLE);
}

//发送字符串
void USART_SendStr(uint8_t *str)
{

    while(*str)
    {
        while((USART_GetFlagStatus(USART1,USART_FLAG_TC))!=SET);
        USART_SendData(USART1,*str);
        str++;
    }
        
}

uint8_t senddata[SEND_MAXBUFF]="ABCDEFGHIJKLMNOPQRST";

int main(void)
{
   Uart_Init();
   while(1)
   {
   USART_SendStr(senddata);
   delay_ms(1000);
   }
}
当使用 USART_SendStr发送字符串“ABCDEFGHIJKLMNOPQRST”时
                                     (16进制为41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54),
通过PC机串口接收到的数据为:C1 C2 43 C4 45 46 C7 C8 49 4A CB 4C CD CE 4F D0 51 52 D3 54
其中正确的数据为:                             43      45 46            49 4A                      4F       51 52      54
当使用USART_SendStr发送字符串43 45 46 49 4A 4F 51 52 54时,接收正常
当使用库函数USART_SendData以单个字节发送这些正确的数据时(如发送字符'C'),结果也正常
当使用库函数USART_SendData以单个字节发送这些错误的数据时(如发送字符'A'),结果也是错误
更换了串口UART5和USART1 ,调整了波特率、停止位、效验位、数据位、以及GPIO的输出频率,结果仍然是错误,而且出错的字符始终出错,正确的字符始终都是正确的,PC机的串口通过短接2脚和3脚,收发都正常,请高手帮忙看下怎么回事?

沙发
Ketose| | 2014-4-4 10:03 | 只看该作者
在发送前先用USART_ClearFlag(USART1,USART_FLAG_TC)清标志。

使用特权

评论回复
板凳
大秦正声| | 2014-4-4 10:12 | 只看该作者
可能max3232芯片有问题?
用的usb转串口吗?
有条件换一块板子测试。

使用特权

评论回复
地板
wyjben|  楼主 | 2014-4-4 10:13 | 只看该作者
Ketose 发表于 2014-4-4 10:03
在发送前先用USART_ClearFlag(USART1,USART_FLAG_TC)清标志。

但是发单个字符时都有问题啊

使用特权

评论回复
5
大秦正声| | 2014-4-4 10:37 | 只看该作者
看能不能从串口启动bootloader烧写代码。

使用特权

评论回复
6
wyjben|  楼主 | 2014-4-4 11:43 | 只看该作者
是USB转串口的,晚上回去换个TTL转485的转换头试下

使用特权

评论回复
7
icecut| | 2014-4-4 11:46 | 只看该作者
上示波器波形....

使用特权

评论回复
8
wyjben|  楼主 | 2014-4-4 12:06 | 只看该作者
才刚刚开始学习,手上没示波器啊

使用特权

评论回复
9
dirtwillfly| | 2014-4-4 13:56 | 只看该作者
有逻辑分析仪看看波形也可以

使用特权

评论回复
10
yinhaix| | 2015-8-12 20:16 | 只看该作者

使用特权

评论回复
11
songchenping| | 2015-8-12 20:54 | 只看该作者
你可以用示波器看一下发送的错误字符(A)看看波形是否正确,在CPU的TXD管脚上测量,然后在通过串口芯片后测量。比较一下。

使用特权

评论回复
12
songchenping| | 2015-8-12 20:55 | 只看该作者
这种错误必须通过示波器查查问题所在。

使用特权

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

本版积分规则

24

主题

99

帖子

1

粉丝