发新帖我要提问
12
返回列表
打印
[STM32MP1]

linux 串口modbus操作

[复制链接]
楼主: tpgf
手机看帖
扫描二维码
随时随地手机跟帖
21
tpgf|  楼主 | 2021-10-1 18:46 | 只看该作者 回帖奖励 |倒序浏览
//测试线程


/*
* UartThread.c
*
*  Created on: 2018年8月5日
*      Author: cfan
*/
#include "UserThread.h"
#include "Uart.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include "modbus_rtu.h"
#include "SystemLog.h"
#include "modbus_rtu.h"



MODBUS_HANDLE g_ModbusHandle;                //modbus句柄
UART_HANDLE g_UartHandle1;                        //串口1句柄
#define MODBUS_BUFF_SIZE        512
static u8 ModbusBuff[MODBUS_BUFF_SIZE];




//MODBUS1发送数据接口
bool MODBUS1_SendData(u8 *pDataBuff, u16 DataLen)
{
        if(UART_SendData(&g_UartHandle1, pDataBuff, DataLen) <= 0) return FALSE;
        usleep(1000);
        return TRUE;
}

//MODBUS1接收数据接口
int MODBUS1_ReadData(u8 **pDataBuff, u8 ByteTimeOut, u16 TimeOut, u16 *pReceiveDelay)
{
        u8 *p = ModbusBuff;
        u32 cnt = 0;
        u32 TimeOutCnt;
        u32 i;
        int len;
        u16 ReceiveDelay = 0;

        if(ByteTimeOut < 1) ByteTimeOut = 1;
        TimeOutCnt = TimeOut/ByteTimeOut+1;

        for(i = 0;i < TimeOutCnt;i ++)
        {
                usleep((u32)ByteTimeOut*1000);                //字节延时-帧间隔延时
                len = UART_ReadData(&g_UartHandle1, &p[cnt], MODBUS_BUFF_SIZE-1-cnt);        //读取数据
                //if(len < 0) return -1;                                //读取错误-非阻塞没有读取到数据也会返回-1,此处不做处理
                if(len < 0)len = 0;
                cnt += len;                                                        //加上收到的数据
                ReceiveDelay += ByteTimeOut;                //记录接收延时
                if((cnt >= (MODBUS_BUFF_SIZE-1)) || ((cnt > 0) && (len==0)))         //接收完成-接收缓冲区满或 接收数据长度大于0,并且当前周期没有接收到数据则认为接收完成
                {
                        *pDataBuff = p;                                //返回接收数据指针
                        if(pReceiveDelay != NULL) *pReceiveDelay = ReceiveDelay;//返回接收延时
                        return cnt;
                }
                else if((cnt > 0) && (len>0))                //如果一直有数据返回,则等待缓冲区满为止
                {
                        if(i > 1) i --;
                }
        }

        return 0;
}

//清除MODBUS1接收数据接口
void MODBUS1_ClearRxData(void)
{
        UART_ClearRxData(&g_UartHandle1);
}

//ms延时接口
void DelayMS(u8 ms)
{
        usleep(1000*ms);
}


//串口线程
void *UartThread(void *arg)
{
        int error;
        u16 RegData[16];

        printf("UartThread 启动...\r\n");
        error = UART_Init(&g_UartHandle1, "/dev/ttyS1", UART_B115200);        //初始化串口
        if(error != 0)
        {
                plog("%s(%s) 串口初始化失败,错误%d.\r\n",__FILE__, __LINE__, error);
                return NULL;
        }


        //初始化MODBUS
        if(MODBUS_Init(&g_ModbusHandle, ModbusBuff, 128-1, 10, 500,
                        MODBUS1_SendData, MODBUS1_ReadData, MODBUS1_ClearRxData, DelayMS) == FALSE)                                                                //延时接口
        {
                printf("初始化Modbus协议栈失败!\r\n");
                plog("%s(%s) 初始化Modbus协议栈失败.\r\n",__FILE__, __LINE__);
        }


        while(1)
        {
                error = MODBUS_HOST_ReadMultReg(&g_ModbusHandle, HOLD_REG, 1, 0, 8, RegData);
                if(error == MRTU_OK) //读取成功
                {
                        printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\r\n",RegData[0],RegData[1],RegData[2],RegData[3],RegData[4],RegData[5],RegData[6],RegData[7]);
                }
                else
                {
                        //printf("MODBUS读取错误:%d\r\n",error);
                }

                sleep(3);
        }
}


使用特权

评论回复
22
tpgf|  楼主 | 2021-10-1 18:46 | 只看该作者
//UserThread.h


/*
* UserThread.h
*
*  Created on: 2018年8月5日
*      Author: cfan
*/

#ifndef USERTHREAD_USERTHREAD_H_
#define USERTHREAD_USERTHREAD_H_


void *UartThread(void *arg);                //串口线程

#endif /* USERTHREAD_USERTHREAD_H_ */

使用特权

评论回复
23
sanxingnote7| | 2021-10-6 16:02 | 只看该作者
stm32能运行吗   

使用特权

评论回复
24
weifeng90| | 2021-10-7 09:22 | 只看该作者
能一次性发完嘛,泪奔。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则