485通讯,发送完数据从机立刻返回,主机接收数据不完整问题

void UART485_TX_START(void)
{      
      RS485EN(1); 
      for(ProbeUart_TxIdx =0;ProbeUart_TxIdx<pProbeUart_TxBuf;ProbeUart_TxIdx++)
      {
          // Load data onto buffer
         USCI_A_UART_transmitData(USCI_A0_BASE,ProbeUart_TxBuf[ProbeUart_TxIdx]);
      
      }
      __delay_cycles(2000);  //做下延时否则数据发送出错,或者失败 
      RS485EN(0);
      ProbeUart_TxBufClr();  //发送清空操作
}

 __delay_cycles(2000);  //做下延时否则数据发送出错,或者失败 

不延时主机发送数据失败,延时时间过长,如果从机立马返回,主机接收数据异常

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言示例代码,用于实现Modbus协议的485多机通讯,包括波特率9600和在校验错误时重新发送数据的处理: ```c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> #define SLAVE_ADDR 0x01 // 从机地址 #define FUNC_CODE 0x03 // 功能码 #define START_ADDR 0x0000 // 起始地址 #define REG_NUM 0x0001 // 寄存器数量 int main() { int fd; unsigned char send_buf[8] = {SLAVE_ADDR, FUNC_CODE, START_ADDR >> 8, START_ADDR & 0xFF, REG_NUM >> 8, REG_NUM & 0xFF, 0x00, 0x00}; // Modbus数据帧 unsigned char recv_buf[256]; int send_len = 8; int recv_len; int i; struct termios opt; fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY); if (fd < 0) { perror("Cannot open serial port"); return -1; } tcgetattr(fd, &opt); cfsetispeed(&opt, B9600); // 设置波特率为9600 cfsetospeed(&opt, B9600); opt.c_cflag |= (CLOCAL | CREAD); opt.c_cflag &= ~CSIZE; opt.c_cflag |= CS8; opt.c_cflag &= ~PARENB; // 禁用校验 opt.c_cflag &= ~CSTOPB; opt.c_cc[VTIME] = 0; opt.c_cc[VMIN] = 8; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &opt); while (1) { write(fd, send_buf, send_len); // 发送数据 usleep(100000); // 延时等待回复 recv_len = read(fd, recv_buf, 256); // 接收数据 if (recv_len > 0) { // 解析数据 for (i = 0; i < recv_len; i++) { printf("%02X ", recv_buf[i]); } printf("\n"); } else { // 重新发送数据 write(fd, send_buf, send_len); usleep(100000); } } close(fd); return 0; } ``` 在以上代码中,我们使用Linux系统提供的串口通信API,通过打开`/dev/ttyS1`设备文件来进行485通讯。我们使用了`termios`结构体来设置串口参数,包括波特率、数据位、停止位、校验等。在发送数据时,我们使用`write`函数发送Modbus数据帧,然后使用`usleep`函数进行延时等待从机回复数据。在接收数据时,我们使用`read`函数读取从机返回数据,并进行解析。如果校验错误或者没有收到从机回复数据,则重新发送相同的数据帧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值