移植FreeModbus到FreeRTOS系统上

2023-05-16

实测连接西门子的组态屏运行正常

1、串口驱动移植
portserial.c

BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits,
        eMBParity eParity)
{
	modubs_user_usart_init();
	
	__HAL_UART_DISABLE( &huart3 );
	
	__HAL_UART_DISABLE_IT( &huart3, UART_IT_TXE );
	__HAL_UART_DISABLE_IT( &huart3, UART_IT_RXNE );
	__HAL_UART_CLEAR_FLAG( &huart3, UART_FLAG_TC | UART_FLAG_RXNE );
	
	__HAL_UART_ENABLE( &huart3 );

    return TRUE;
}

void vMBPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable)
{
    if(xRxEnable == TRUE)
	{
		__HAL_UART_ENABLE_IT( &huart3, UART_IT_RXNE );
	}
	else
	{
		__HAL_UART_DISABLE_IT( &huart3, UART_IT_RXNE );
	}

	if(xTxEnable == TRUE)
	{
		__HAL_UART_ENABLE_IT( &huart3, UART_IT_TXE );
	}
	else
	{
		__HAL_UART_DISABLE_IT( &huart3, UART_IT_TXE );
	}
}

void vMBPortClose(void)
{
    
}

BOOL xMBPortSerialPutByte(CHAR ucByte)
{
//	modbus_user_send_byte(ucByte);
	huart3.Instance->DR = (ucByte & (uint16_t)0x01FF);
    return TRUE;
}

BOOL xMBPortSerialGetByte(CHAR * pucByte)
{
//	modbus_user_recv_byte(pucByte);
	*pucByte = (uint16_t)(huart3.Instance->DR & (uint16_t)0x01FF);
    return TRUE;
}

初始化,使能接收发送,发送字节,接收字节等几个函数

2、portevent.c

/* ----------------------- Variables ----------------------------------------*/
static eMBEventType eQueuedEvent;
static BOOL     xEventInQueue;

/* ----------------------- Start implementation -----------------------------*/
BOOL
xMBPortEventInit( void )
{
    xEventInQueue = FALSE;
    return TRUE;
}

BOOL
xMBPortEventPost( eMBEventType eEvent )
{
    xEventInQueue = TRUE;
    eQueuedEvent = eEvent;
		
    return TRUE;
}

BOOL
xMBPortEventGet( eMBEventType * eEvent )
{
    BOOL            xEventHappened = FALSE;

    if( xEventInQueue )
    {
        *eEvent = eQueuedEvent;
        xEventInQueue = FALSE;
        xEventHappened = TRUE;
    }
    return xEventHappened;
}

FreeRTOS中的事件接口

3、porttimer.c

BOOL xMBPortTimersInit(USHORT usTim1Timerout50us)
{
	modbus_user_timer_init();
	
	__HAL_TIM_CLEAR_IT( &htim6, TIM_IT_UPDATE );
	__HAL_TIM_ENABLE_IT( &htim6, TIM_IT_UPDATE );
    return TRUE;
}

void vMBPortTimersEnable()
{
	__HAL_TIM_SET_COUNTER( &htim6, 0 );
	
	HAL_TIM_Base_Start( &htim6 );
}

void vMBPortTimersDisable()
{
	HAL_TIM_Base_Stop( &htim6 );
}

void prvvTIMERExpiredISR(void)
{
    (void) pxMBPortCBTimerExpired();
}

需要使用硬件定时器,系统定时器速度跟不上

4、modbus线程

void moudbus_user_task(void* parameter)
{
	TickType_t ticks = xTaskGetTickCount();
	eMBInit(MB_RTU, 0x01, 1, 115200,  MB_PAR_EVEN);
	eMBEnable();
	while (1)
	{
		eMBPoll();
		modbus_user_variate_limit();
		daemon_refresh();
		//一ms一个处理周期
		vTaskDelayUntil( &ticks, 1 );
	}
}

建立一个处理modbus数据处理的线程,主要调用函数是eMBPoll();

5、modbus回调函数,PC端数据与单片机端数据交互

RTN_T modbus_user_reg_cb(uint8_t * buffer, uint16_t address, uint16_t nregs, eMBRegisterMode mode){
	
//	uint8_t slave_addr;
	
	DEVICE_T	*device_ptr=NULL;
	void		*modbus_ptr=NULL;
	SENSOR_T	*sensor_ptr=NULL;			
	SYS_INTERACTION_T *sys_interaction_ptr = &master_working.sys_interaction;
	
	modbus_user_log("orig address %d\r\n",address);
	modbus_user_log("orig nregs %d\r\n",nregs);
	
//	modbus_user_log("get slave %d\r\n",slave_addr);
//	modbus_user_log("get address %d\r\n",address);
	
	。。。。。。。。。。
	
	if( mode==MB_REG_READ ){
		modubs_user_read_reg((uint16_t*)modbus_ptr,buffer,address,nregs);
	}
	else if( mode==MB_REG_WRITE ){
		master_config.write_time = 0;
		master_config.modbus_write = CONFIG_WRITE_ONCE;
		modubs_user_write_reg((uint16_t*)modbus_ptr,buffer,address,nregs);
	}
	return RTN_OK;
}

主要由mode变量决定的读写操作,modbus_ptr决定读写的地址,由回调函数传入地址计算偏移地址得到

源码下载地址:https://download.csdn.net/download/dmjkun/10889623

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移植FreeModbus到FreeRTOS系统上 的相关文章

随机推荐

  • 检测到"_ITERATOR_DEBUG_LEVEL"的不匹配项

    最近在项目中遇到了问题 xff0c 编译器提示 检测到 34 ITERATOR DEBUG LEVEL 34 的不匹配项 xff0c 上网查找后发现是编译Release版本用到了DEBUG库的原因 xff0c 其中也提供了在预编译中加入 3
  • C语言实现单链表的逆置

    单链表的逆置是一个非常经典的问题 xff0c 这里利用两个思想进行解决 首先 xff0c 我们需要看下原理图 xff0c 其实两个思想都是一样的 xff0c 都是使后一个的节点的 next 指针指向前一个节点 xff0c 依次递推 xff0
  • UNIX下C语言的图形编程-curses.h函数库

    相信您在网路上一定用过如 tin elm 等工具 这些软体有项共同的特色 即他们能利用上下左右等方向键来控制游标的位置 除此之外 这些程式 的画面也较为美观 对 Programming 有兴趣的朋友一定对此感到好奇 也 许他能在 PC 上用
  • 如何同时启动多个Tomcat服务器

    这篇文章转载自 如何同时启动多个Tomcat服务器 conf子目录中打开server xml文件 xff0c 查找以下三处 xff1a 1 修改http访问端口 xff08 默认为8080端口 xff09 span class hljs t
  • 找到合适的方案记录服务端日志

    做过服务端开发的同学都清楚日志是多么的重要 你要分析应用当天的 PV UV 你需要对日志进行统计分析 你需要排查程序 BUG 你需要寻找日志中的异常信息等等 所以 建立一套合适的日志体系是非常有必要的 日志体系一般都会遵循这么几个原则 根据
  • doPDF——word转为PDF软件的使用方法

    doPDF软件下载链接 xff0c 版本doPDF 7 3 379 点击打开链接 1 下载好doPDF软件我们就可以动手安装了 安装到选择打印机的界面 软件使用方法如图所示 xff08 备注我用的是word2007 xff0c 可能与200
  • 过去的 2017 年

    过去的 2017 年分为两个部分 xff0c 前半部分偏忙碌 xff0c 个人时间较少 xff0c 但是收获甚微 xff1b 后半部分进入了一个学习的环境 xff0c 最主要的就是个人可自由支配的时间多了 xff0c 留给了我很多思考的时间
  • Android四大组件详解

    注 xff1a 本文主要来自网易的一个博主的文章 xff0c 经过阅读 xff0c 总结 xff0c 故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity xff0c Service服务
  • Socket通信原理和实践

    我们深谙信息交流的价值 xff0c 那网络中进程之间如何通信 xff0c 如我们每天打开浏览器浏览网页时 xff0c 浏览器的进程怎么与web服务器通信的 xff1f 当你用QQ聊天时 xff0c QQ进程怎么与服务器或你好友所在的QQ进程
  • linux下查看和添加PATH环境变量

    linux下查看和添加PATH环境变量 PATH xff1a 决定了shell将到哪些目录中寻找命令或程序 xff0c PATH的值是一系列目录 xff0c 当您运行一个程序时 xff0c Linux在这些目录下进行搜寻编译链接 编辑你的
  • Linux 内存映射函数 mmap()函数详解

    一 概述 内存映射 xff0c 简而言之就是将用户空间的一段内存区域映射到内核空间 xff0c 映射成功后 xff0c 用户对这段内存区域的修改可以直接反映到内核空间 xff0c 同样 xff0c 内核空间对这段区域的修改也直接反映用户空间
  • Cygwin获取root权限

    1 找到cygwin 的etc目录中有一个名为passwd的文件 2 用写字板打开passwd 这个文件 xff0c 找到以下部分 xff0c 把其中的windows用户名换成root xff08 共3处都改过来 xff09 Adminis
  • Linux Shell 只列出目录的方法

    在实际应用中 xff0c 我们有时需要仅列出目录 xff0c 下面是 4 种不同的方法 1 利用 ls 命令的 d 选项 xff1a ls d Desktop pic shell src 2 利用 ls 命令的 F 选项 xff1a ls
  • 读《Linux内核设计与实现》我想到了这些书

    从题目中可以看到 xff0c 这篇文章是以我读 Linux内核设计与实现 而想到的其他我读过的书 xff0c 所以 xff0c 这篇文章的主要支撑点是 Linux内核 开始读这本书已经是很久以前的事了 xff0c 不过 xff0c 由于时间
  • 计算机保研复习

    操作系统 1 进程间的通信方式 无名管道pipe xff1a 管道是一种半双工的通信方式 xff0c 数据只能单向流动 xff0c 而且只能在具有亲缘关系的进程间使用 进程的亲缘关系通常是指父子进程关系 命名管道FIFO xff1a 有名管
  • Gyro陀螺仪 > MPU 6000 vs ICM 20689

    目录 参考 MPU 6000和ICM 20689对比 陀螺仪的选择 xff1a 采样率与噪声 参考 Gyro MPU 6000 vs ICM 20689 IntoFPV Forum FPV Drone Flight Controller E
  • PV操作与信号灯及例子+三大操作系统共同点的线程通信

    看待技术问题要瞄准其本质 xff0c 不管是Linux VxWorks还是WIN32 xff0c 其涉及到多线程的部分都是那些内容 xff0c 无非就是线程控制和线程通信 xff0c 它们的许多函数只是名称不同 xff0c 其实质含义是等价
  • docker内使用apt-get update时报Temporary failure resolving ‘security.ubuntu.com错的解决方法

    经常构建docker 镜像的时候 xff0c 在镜像Build时需要经常软件的安装或更新时 xff0c 运行apt get update 或者apt get install 时出现Temporary failure resolving 39
  • ffmpeg 之 RTMP 一

    1 RTMP 介绍 RTMP Real Time Messaging Control 是Adobe 公司flash 播放器和服务器之间的音视 xff0c 视频以及数据传输的流媒体协议 该协议是个协议族 xff0c 包括多种协议 xff0c
  • 移植FreeModbus到FreeRTOS系统上

    实测连接西门子的组态屏运行正常 1 串口驱动移植 portserial c BOOL xMBPortSerialInit UCHAR ucPORT ULONG ulBaudRate UCHAR ucDataBits eMBParity eP