RS485_SendBuf
时间: 2023-12-17 16:04:13 浏览: 47
RS485_SendBuf函数是一个用于通过RS485总线发送数据的函数。该函数需要传入三个参数:数据缓存buf、数据长度len和RS485发送使能控制信号RS485_En。函数内部通过循环发送buf中的每一个字符,并在发送完成后切换为接收模式。需要注意的是,为了避免数据还没发送完就切换为接收模式,函数内部需要添加适当的延时。
以下是RS485_SendBuf函数的代码实现:
```c
void RS485_SendBuf(uchar *buf, uchar len) {
uchar cnt = 0;
RS485_En = 1; // 485发送模式
delay_ms(1);
while (cnt++ < len) {
Uart1SendData(*buf++); // 发送当前字符
}
delay_ms(5);
RS485_En = 0; // 485接收模式
}
```
相关问题
void app_rs485_thread(void *arg) { uint32_t var_displace; uint16_t crcsenddata; Temp_data.baudrate = 115200; rs485_init(Temp_data.baudrate); while(1) { osMutexAcquire(tempmutex,osWaitForever); rs485_receive_data(Temp_data.receivebuf,&Temp_data.rs485_receivelen); if(Temp_data.rs485_receivelen>0&&Temp_data.rs485_receivelen<RS485_BUFLEN) { if (Temp_data.receivebuf[1] == WRITEBAUDRATE) { uint16_t baudratecrc = crc16_modbus(Temp_data.receivebuf,6); uint16_t baudratecrc_H = (uint16_t)((baudratecrc&0xFF00)>>8); uint16_t baudratecrc_L = (uint16_t)(baudratecrc&0x00FF); if((baudratecrc_H == Temp_data.receivebuf[6])&&(baudratecrc_L == Temp_data.receivebuf[7])) { uint16_t baudrate_H = (uint16_t)(Temp_data.receivebuf[4]&0xFF00); uint16_t baudrate_L = (uint16_t)Temp_data.receivebuf[5]; Temp_data.baudrate = (baudrate_H<<8)|baudrate_L; rs485_init(Temp_data.baudrate); } } else if (Temp_data.receivebuf[1] == READTEMPDATA) { crcreceivedata = crc16_modbus(Temp_data.receivebuf,Temp_data.rs485_receivelen-2); if(((uint8_t)((crcreceivedata&0xFF00)>>8) == Temp_data.receivebuf[Temp_data.rs485_receivelen-2])&&((uint8_t)(crcreceivedata&0xFF) == Temp_data.receivebuf[Temp_data.rs485_receivelen-1])) { Temp_data.sendbuf[0] = 0x01;//addr Temp_data.sendbuf[1] = 0x03;//Function code Temp_data.sendbuf[2] = 0x00; Temp_data.sendbuf[3] = 0x08; temp485_send = (uint32_t)(Temp_data.tempmax*10000); for(uint8_t i =4;i<8;i++) { var_displace = (7-i)*8; Temp_data.sendbuf[i] = (uint8_t)((temp485_send&(0xFF<<var_displace))>>var_displace);//i=4 1111 1111<<(3*8)24 = 1111 1111 0000 0000 0000 0000 0000 0000 } for(uint8_t i =8;i<12;i++) { Temp_data.sendbuf[i] = Temp_data.pwm_RD[i-8]; } crcsenddata = crc16_modbus(Temp_data.sendbuf,12); Temp_data.sendbuf[12] = (crcsenddata&0xFF00)>>8; Temp_data.sendbuf[13] = (crcsenddata&0xFF); osDelay(500); rs485_send_data(Temp_data.sendbuf,14); osDelay(500); } } } osMutexAcquire(tempmutex,osWaitForever); } },解析这段代码
这段代码是一个线程函数,用于处理RS485通信的数据接收和发送。下面对代码进行解析:
1. 首先,通过调用`rs485_init()`函数初始化RS485通信的波特率。在该示例中,波特率为115200。
2. 然后,进入一个无限循环,在循环中通过调用`rs485_receive_data()`函数接收RS485通信的数据,并将接收到的数据保存在`Temp_data.receivebuf`中,并更新接收数据的长度`Temp_data.rs485_receivelen`。
3. 如果接收到的数据长度大于0且小于`RS485_BUFLEN`(一个预定义的缓冲区大小),则进行以下处理:
a. 如果接收到的数据的功能码为`WRITEBAUDRATE`,则进行波特率设置操作。首先对接收到的数据进行CRC校验,校验通过后从接收到的数据中提取出波特率数据,并将其赋值给`Temp_data.baudrate`。然后通过调用`rs485_init()`函数重新初始化RS485通信的波特率。
b. 如果接收到的数据的功能码为`READTEMPDATA`,则进行温度数据读取操作。首先对接收到的数据进行CRC校验,校验通过后根据实际情况组织需要发送的数据,并将其保存在`Temp_data.sendbuf`中。然后通过调用`rs485_send_data()`函数将发送数据发送出去。
4. 在处理完接收和发送的数据后,通过调用`osDelay()`函数进行延时,以控制通信的时间间隔。
5. 最后,通过调用`osMutexAcquire()`函数获取互斥锁`tempmutex`,以保证对共享资源的访问是互斥的。
需要注意的是,这段代码是一个简化的示例,具体的实现可能会因使用的硬件平台和通信库的不同而有所差异。在实际应用中,还需根据具体需求进行适当的调整和优化。
Can_SendBuf[Index].Buf[0] = 0x33; Can_SendBuf[Index].Buf[4] = *(uint8_t *)(&speedPidKi); Can_SendBuf[Index].Buf[5] = *((uint8_t *)(&speedPidKi)+1); Can_SendBuf[Index].Buf[6] = *((uint8_t *)(&speedPidKi)+2); Can_SendBuf[Index].Buf[7] = *((uint8_t *)(&speedPidKi)+3);
这段代码对一个名为`Can_SendBuf`的数组进行操作。其中`Index`是索引值,表示要操作的数组元素的位置。
第一行代码将0x33赋值给`Can_SendBuf[Index].Buf[0]`,即将0x33存储到`Can_SendBuf`数组中指定位置的第一个字节。
接下来的四行代码是将`speedPidKi`的值按字节拆分,并分别存储到`Can_SendBuf[Index].Buf`数组的指定位置。这里使用了指针的强制类型转换和指针偏移操作来访问`speedPidKi`的不同字节。具体地,`*(uint8_t *)(&speedPidKi)`表示取`speedPidKi`的第一个字节,`*((uint8_t *)(&speedPidKi)+1)`表示取第二个字节,以此类推。
整个代码片段的作用是将特定的数值存储到`Can_SendBuf`数组中指定位置的字节中,用于后续的CAN数据发送。