问题描述
两个设备(计算机和STM8S2板)之间的UART1通信出现问题。
我在计算机中实现了将两个字节长的数据写入STM8的软件
•用作标识符的第一个字节;
•第二个字节是我想在VLS内存中写入的数据,
但是,在STM8中,仅读取了第一个字节,并且读取了两次, 例如,我发送了标识符0xb7和数据0x90,但只有字节0xb7被存储为(0xb7,0xb7)。
现在,我正在实现它通过UART中断每次读取1个字节的长度,但是恐怕它会使固件更容易出现错误(如果有数据)具有与标识符字节相同的值。
我认为最好的解决方案是将其作为两个字节的数据发送。但是我该怎么实现呢?为什么只重复读取第一个字节呢?
以下是STM8中用于接收和写入数据的功能:
void UART1_ReceiveBytes(uint8_t * buf,uint8_t numberOfBytes)
{
while (numberOfBytes > 0){
*(buf++) = UART1_ReceiveData8();
numberOfBytes--;
}
}
void UART1_SendBytes(uint8_t *data,unsigned int numberOfBytes)
{
while (numberOfBytes > 0) {
UART1_SendData8(*data++);
numberOfBytes--;
while(UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
}
}
UART设置:
void UART1_setup(void)
{
UART1_DeInit();
UART1_Init( 9600,UART1_WORDLENGTH_8D,UART1_STOPBITS_1,UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_disABLE,UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE);
enableInterrupts();
UART1_Cmd(ENABLE);
}
正在发送到STM8的数据示例
我正在将ST Visual Develop与Cosmic编译器一起使用。
预先感谢
解决方法
函数UART1_ReceiveBytes
错误。它不会等待新角色的到来。应该是这样的:
void UART1_ReceiveBytes(uint8_t * buf,uint8_t numberOfBytes)
{
while (numberOfBytes > 0)
{
while (!(UART1->SR & (UART1_SR_RXNE)))
{
//timeout considerations,you can just leave it empty
}
*(buf++) = UART1_ReceiveData8();
numberOfBytes--;
}
}