1.底盘上面有串口协议,可以使用无线串口进行通信,这样需要使用两个无线串口透传模块:无线转USB和无线转串口。
还需要使用转换器件TTL转RS232模块。
这种会降低难度,但是通讯范围为100m,所以要根据自己的实际需求决定要不要用这个
2.底盘上还有CAN总线通信协议,可以通过can转wifi、can转tcp把无线通信的信号转换成CAN信号。这个通讯距离是有保障的。
两机如何通讯,一般取决于下位机。TCP/IP一般是支持的。但是下位机一般具有更可靠的独有通讯协议,购买下位机时,手册里会告诉如何使用特有协议通讯。
通常上位机和下位机通讯可以采用不同的通讯协议,可以有RS232的串口通讯,或者采用RS485串行通讯,当用计算机和PLC通讯的时候不但可以采用传统的D形式的串行通讯,还可以采用更适合工业控制的双线的PROFIBUS-DP通讯,采用封装好的程序开发工具就可以实现PLC和上位机的通讯。当然可以自己编写驱动类的接口协议控制上位机和下位机的通讯。
uint32_t startByteIndex = 0;
static uint8_t buffer[500];
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
int headerIndex = 0;
uint8_t noHeader = 0;
uint8_t checkSum = 0;
uint8_t msgLength = 0;
if(huart->Instance==USART1)
{
memcpy(&buffer[startByteIndex],u1RxBuffer,Size);
result = HAL_UARTEx_ReceiveToIdle_IT(&huart1, u1RxBuffer,500);
if(result!=0)
{
__NOP();
}
do
{
noHeader = 1;
for(int i=headerIndex;i<(startByteIndex+Size);i++)
{
if(buffer[i] == 0xFF)
{
headerIndex = i;
noHeader = 0;
break;
}
}
if(noHeader == 1)
{
startByteIndex = 0;
break;
}
if((headerIndex+1) < (startByteIndex+Size))
{
msgLength = buffer[headerIndex+1];
}
else
{
memcpy(buffer,&buffer[headerIndex],startByteIndex + Size - headerIndex);
startByteIndex = startByteIndex + Size - headerIndex;
break;
}
if((headerIndex + msgLength + 3) <= (startByteIndex + Size))
{
checkSum = 0;
for(int i=0;i<msgLength + 2;i++)
{
checkSum += buffer[headerIndex+i];
}
if(checkSum == buffer[headerIndex + msgLength + 2])
{
gRxDataType.Unpack(&buffer[headerIndex+2],msgLength);
headerIndex = headerIndex + msgLength + 3;
}
else
{
startByteIndex = 0;
break;
}
}
else
{
memcpy(buffer,&buffer[headerIndex],startByteIndex + Size - headerIndex);
startByteIndex = startByteIndex + Size - headerIndex;
break;
}
}while(1);
}
}
1、RS232串口通讯
接口的信号电平值较高,易损坏接口电路的芯片,传输速率较低,传输距离有限。
2、CAN模块通讯
具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点;可根据报文的内容决定接收或屏蔽该报文;通讯过程信道容易阻塞。