工控BLUCK 2024-05-15 21:35 采纳率: 69%
浏览 14
已结题

关于#stm32#的问题:STM32串口发送问题,偶校验(even),发送5A 41 FB 20.烧录程序后发现串口助手读到的是5A 41 7B A0

STM32串口发送问题,通信协议是115200-8-2-1,偶校验(even),发送5A 41 FB 20.烧录程序后发现串口助手读到的是5A 41 7B A0 ;如果改为无校验,串口助手读到正常的5A 41 FB 20


```c
#include "stm32f4xx.h"
#include "./usart/bsp_debug_usart.h"

/**
  * @brief  Ö÷º¯Êý
  * @param  ÎÞ
  * @retval ÎÞ
  */
uint8_t data[] = {0x5A, 0x41};
uint16_t crc;
uint8_t crc_byteL;
uint16_t i; 
uint8_t j;
uint8_t crc_byteH;
void CRC_Calculate(uint8_t *Data, uint16_t DataLength) {
    crc = 0xFFFF;
    for ( i = 0; i < DataLength; i++) {
        crc ^= Data[i];
        for (j = 0; j < 8; j++) {
            if (crc & 0x0001) {
                crc >>= 1;
                crc ^= 0xA001; 
            } else {
                crc >>= 1;
            }
        }
    }
    
    crc_byteL = crc & 0xFF;
        crc_byteH =(crc& 0xff00) >> 8;
}
 
int main(void) {
     Debug_USART_Config();
     USART_SendDaTa(DEBUG_USART, data[0]);
   while (!USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE));
      USART_SendDaTa(DEBUG_USART, data[1]);
 while (!USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE));
    CRC_Calculate(data,2); 
    data[0] = crc_byteL; 
    data[1]=crc_byteH;
    USART_SendDaTa(DEBUG_USART, data[0]);
   while (!USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE));
      USART_SendDaTa(DEBUG_USART, data[1]);
 while (!USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE));

 
//    USART_SendDaTa(DEBUG_USART, data[1]);
//    while (!USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE));
//    USART_SendDaTa(DEBUG_USART, data[2]);
//    while (!USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE));
//    USART_SendDaTa(DEBUG_USART, data[3]); // ??CRC?
 // while (!USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TC));
 
    while (1) {
       
    }
}
 


```c
#include "./usart/bsp_debug_usart.h"


 /**
  * @brief  ÅäÖÃǶÌ×ÏòÁ¿ÖжϿØÖÆÆ÷NVIC
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* ǶÌ×ÏòÁ¿ÖжϿØÖÆÆ÷×éÑ¡Ôñ */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* ÅäÖÃUSARTΪÖжÏÔ´ */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* ÇÀ¶ÏÓÅÏȼ¶Îª1 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* ×ÓÓÅÏȼ¶Îª1 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* ʹÄÜÖÐ¶Ï */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* ³õʼ»¯ÅäÖÃNVIC */
  NVIC_Init(&NVIC_InitStructure);
}


 /**
  * @brief  DEBUG_USART GPIO ÅäÖÃ,¹¤×÷ģʽÅäÖá£115200 8-N-1 £¬ÖжϽÓÊÕģʽ
  * @param  ÎÞ
  * @retval ÎÞ
  */
void Debug_USART_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
        
  RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK,ENABLE);

  /* ʹÄÜ USART ʱÖÓ */
  RCC_APB2PeriphClockCmd(DEBUG_USART_CLK, ENABLE);
  
  /* GPIO³õʼ»¯ */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
  /* ÅäÖÃTxÒý½ÅΪ¸´Óù¦ÄÜ  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN  ;  
  GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  /* ÅäÖÃRxÒý½ÅΪ¸´Óù¦ÄÜ */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;
  GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  
 /* Á¬½Ó PXx µ½ USARTx_Tx*/
  GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE,DEBUG_USART_RX_AF);

  /*  Á¬½Ó PXx µ½ USARTx__Rx*/
  GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);
  
  /* ÅäÖô®DEBUG_USART ģʽ */
  /* ²¨ÌØÂÊÉèÖãºDEBUG_USART_BAUDRATE */
  USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
  /* ×Ö³¤(Êý¾Ýλ+УÑéλ)£º8 */
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  /* ֹͣλ£º1¸öֹͣλ */
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  /* УÑéλѡÔñ£º²»Ê¹ÓÃУÑé */
  USART_InitStructure.USART_Parity =  USART_Parity_No;
  /* Ó²¼þÁ÷¿ØÖÆ£º²»Ê¹ÓÃÓ²¼þÁ÷ */
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  /* USARTģʽ¿ØÖÆ£ºÍ¬Ê±Ê¹ÄܽÓÊպͷ¢ËÍ */
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  /* Íê³ÉUSART³õʼ»¯ÅäÖà */
  USART_Init(DEBUG_USART, &USART_InitStructure); 
    
  /* ǶÌ×ÏòÁ¿ÖжϿØÖÆÆ÷NVICÅäÖà */
    NVIC_Configuration();
  
    /* ʹÄÜ´®¿Ú½ÓÊÕÖÐ¶Ï */
    USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE);
    
  /* ʹÄÜ´®¿Ú */
  USART_Cmd(DEBUG_USART, ENABLE);
}

/*****************  ·¢ËÍÒ»¸ö×Ö·û **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
    /* ·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ýµ½USART */
    USART_SendData(pUSARTx,ch);
        
    /* µÈ´ý·¢ËÍÊý¾Ý¼Ä´æÆ÷Ϊ¿Õ */
    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);    
}

/*****************  ·¢ËÍ×Ö·û´® **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
    unsigned int k=0;
  do 
  {
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* µÈ´ý·¢ËÍÍê³É */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  {}
}

/*****************  ·¢ËÍÒ»¸ö16λÊý **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
    uint8_t temp_h, temp_l;
    
    /* È¡³ö¸ß°Ëλ */
    temp_h = (ch&0XFF00)>>8;
    /* È¡³öµÍ°Ëλ */
    temp_l = ch&0XFF;
    
    /* ·¢Ë͸߰Ëλ */
    USART_SendData(pUSARTx,temp_h);    
    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
    
    /* ·¢Ë͵ͰËλ */
    USART_SendData(pUSARTx,temp_l>>1);    
    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);    
}

///Öض¨Ïòc¿âº¯Êýprintfµ½´®¿Ú£¬Öض¨Ïòºó¿ÉʹÓÃprintfº¯Êý
int fputc(int ch, FILE *f)
{
        /* ·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ýµ½´®¿Ú */
        USART_SendData(DEBUG_USART, (uint8_t) ch);
        
        /* µÈ´ý·¢ËÍÍê±Ï */
        while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);        
    
        return (ch);
}

///Öض¨Ïòc¿âº¯Êýscanfµ½´®¿Ú£¬ÖØдÏòºó¿ÉʹÓÃscanf¡¢getcharµÈº¯Êý
int fgetc(FILE *f)
{
        /* µÈ´ý´®¿ÚÊäÈëÊý¾Ý */
        while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);

        return (int)USART_ReceiveData(DEBUG_USART);
}
void USART_SendDaTa(USART_TypeDef * pUSARTx, uint8_t Data) {
    while (!USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE));
    USART_SendData(pUSARTx, Data);
    while (!USART_GetFlagStatus(pUSARTx, USART_FLAG_TC));
}


  • 写回答

13条回答 默认 最新

查看更多回答(12条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月16日
  • 已采纳回答 5月16日
  • 赞助了问题酬金20元 5月15日
  • 创建了问题 5月15日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵