我正在将标准 UART 接口转换为 RS485。
下面的流程图中介绍了该计划的流程。 传感器正在等待命令、接收到命令后、传感器会连续发送数据、直至发出停止命令
在传感器和 RS485至 USB 接口中、DE 引脚都连接到收发器的 RE 引脚。 在传感器中、两个引脚连接到芯片 FT232RL 的 CBUS2引脚(该引脚配置为 RXLED)。 在传感器中、两个引脚连接到 TM4C123微控制器的 PORTF.3。
测试中使用的 RS485链路长度为几厘米、传感器和接口都具有120欧姆的端接电阻器。 ISL83485用作收发器。 仅在接口中、A 引脚与560 Ω 上拉 电阻器连接、B 引脚与560 Ω 下拉电阻器连接。
波特率为230400、但在最终配置中将提升至500k 波特
关于固件方面、我进行了两项测试
1) 1)当程序启动时、DE 和 RE*为低电平。 发出命令后,DE 和 RE*在例程 UARTSEND()的开头被驱动为高电平,在该例程的末尾被驱动为低电平。 在该配置中、正确发出 START 命令、但 在传感器传输时接收到垃圾数据。 另一种意外行为是传感器无法正确接收 STOP 命令
2) 2) DE 和 RE*在程序启动时处于低电平。 发出命令后,DE 和 RE*在例程 UARTSEND()的开头被驱动为高电平,然后在例程的末尾不被驱动为低电平。 在该配置中、数据被正确接收
从通信的角度而言、我附加了代码中最相关的部分?
我缺少什么? 从固件的角度来看、驱动 RS485方向控制信号的合适方法是什么?
提前感谢
空
UART1 IntHandler (空)
{
uint32_t ui32StatusRX;
RingBufFlush (&rxRingBuf);
//
//获取中断状态。
//
ui32StatusRX = ROM_UARTIntStatus (UART1_BASE、TRUE);
//
//清除已发出的中断。
//
ROM_UARTIntClear (UART1_BASE、ui32StatusRX);
//接收超时中断在 FIFO 中接收到字节但尚未接收到字节时触发
//已足够触发您的 Rx 中断。 这是因为 FIFO 级别选择决定了何时进行
// T_RT)
{
// FIFO 中有要读取的字节和空间。
while (UARTCharsAvail (UART1_base)&& RingBufFull (&rxRingBuf)== false)
{
uint32_t ch =(uint8_t) ROM_UARTCharGet (UART1_base);
//将一个字节从硬件 FIFO 直接写入到我们的 Rx FIFO 中以供以后处理。
RingBufWriteOne (&rxRingBuf、ch);
}
}
if (((ui32StatusRX 和 UART_INT_RX)== UART_INT_RX)
{
//
//在接收 FIFO 中有字符时循环。
//
while (ROM_UARTCharsAvail (UART1_base)&& BufFull (&rxRingBuf)== false)
{
//
//从 UART 读取下一个字符
//
uint32_t ch =(uint8_t) ROM_UARTCharGet (UART1_base);
RingBufWriteOne (&rxRingBuf、ch);
}
}
空
UARTSend (const uint8_t * pui8Buffer、uint32_t ui32Count)
{
GPIO_PORTF_DATA_R |= TX_EN_RS485;
while (ui32Count---)
{
ROM_UARTCharPut (UART1_base、* pui8Buffer++);
}
GPIO_PORTF_DATA_R &=~ TX_EN_RS485;
}
void
ADXL357_SendAllAccData (void)
{
字符串[10];
//从传感器收集数据;变量 sample_in.z 包含传感器数据
sprintf (string、"%+.6F"、sample_in.z);
UARTSend ((uint8_t *) string、strlen (string));
UARTSend ("\n",1);
}
int
main (void){
uint8_t ret = false;
uint8_t acc_Continuous_scan = 0x00;
uint8_t MODULE_Continuous_scan = 0x00;
ROM_IntMasterDisable();
ConfigureMicroProcessor();
LEDsTest();
ROM_IntMasterEnable();
GPIO_PORTF_DATA_R &=~ TX_EN_RS485;
while (1)
{
if (RingBufEmpty (&rxRingBuf)=false)
{
//我们是否收到足够的字节,使其成为消息?
if (RingBufUsed (&rxRingBuf)=sizeof (uint8_t[8]))
{
uint8_t rec[8];
//将字节读入我们收到的消息结构。
RingBufRead (&rxRingBuf、(uint8_t*)&rec、sizeof (receivedMsg));
//附加地址
如果(rec[2]='0'& rec[3]='1')
{
ADXL357_SendAllAccData();
}
}
}