我在用simulink做上位机,做在环仿真,使用stm32f103c8t6的USART1串口通信,simulink连上串口与单片机通信,sinmulink计算完成发给单片机,单片机计算完再回传给simulink,这样循环。
问题是: 传输中,能传输整型数组,单个的浮点数据可以传输,但是,涉及到带小数点数据的数组就会卡死不动。
这是单片机收发函数的代码
void Serial_SendByte(double Byte)
{
USART_SendData(USART1, Byte); //将字节数据写入数据寄存器,写入后USART自动生成时序波形
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完成
/*下次写入数据寄存器会自动清除发送完成标志位,故此循环后,无需清除标志位*/
}
/**
* 函 数:串口发送一个数组
* 参 数:Array 要发送数组的首地址
* 参 数:Length 要发送数组的长度
* 返 回 值:无
*/
void Serial_SendArray(double *Array, uint16_t Length)
{
uint16_t i;
for (i = 0; i < Length; i ++) //遍历数组
{
Serial_SendByte(Array[i]); //依次调用Serial_SendByte发送每个字节数据
}
}
/**
* 函 数:获取串口接收标志位
* 参 数:无
* 返 回 值:串口接收标志位,范围:0~1,接收到数据后,标志位置1,读取后标志位自动清零
*/
uint8_t Serial_GetRxFlag(void)
{
if (Serial_RxFlag == 1) //如果标志位为1
{
Serial_RxFlag = 0;
return 1; //则返回1,并自动清零标志位
}
return 0; //如果标志位为0,则返回0
}
double Serial_GetRxData(void)
{
return Serial_RxData; //返回接收的数据变量
}
void USART1_IRQHandler(void)
{
static uint32_t RxState = 0;
static uint32_t pRxPacket = 0;
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
double RxData = USART_ReceiveData(USART1);
if (RxState == 0)
{
if (RxData == 1)
{
RxState = 1;
pRxPacket = 0;
}
}
else if (RxState == 1)
{
Serial_RxPacket[pRxPacket] = RxData;
pRxPacket ++;
if (pRxPacket >= 2)
{
RxState = 2;
}
}
else if (RxState == 2)
{
if (RxData == 2)
{
RxState = 0;
Serial_RxFlag = 1;
}
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
这是simulink模块的配置