这个实验是在上半年的四月份做的,之前并没有发到网上。具体的工程已经发上了Github,有需要的自取。
链接在文末,如果有帮助请点赞,也欢迎转载,注明出处即可!谢谢!
实验目的:Modbus从站,使用RTU通过USB与PC机通信。
(由于没有485和232,所以用了USB的防232,区别在于没有时钟线。github的工程是具有读保持寄 存器功能和写多个寄存器)
实验器材:MDK5,STM32CUBEMX,Modsbu_Tool(这个是PC端的modbus的主站)
1,首先是配置相应的管脚以及生成工程
这一步是使用STM32CUBEMX配置生成的,主要的就是USART1,RCC,都是默认设置。
时钟是使用外部输入时钟,只要不超出频率范围即可
由于生成工程的挺大的,为了节省一下编译时间和电脑内存,选择了仅生成所需软件包。
2,接下来就是修改程序
由于这个是自己做的程序包,所以在单独生成一个.c/.h的文件。并把头文件加到mian.c中。
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "modbutest.h"
/* USER CODE END Includes */
加入所需要的一些定义
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern uint16_t DB_R[100];
uint8_t buff1[100];
int buff1stat=0;
uint8_t buff2[100];
int flag=0;
uint8_t RxByte;
/* USER CODE END PV */
以及在实验中自己在寄存器中存的数据,加在主函数里
/* USER CODE BEGIN 1 */
DB_R[0] = 0x0102;
DB_R[1] = 0x0204;
DB_R[2] = 0x0306;
DB_R[3] = 0x0408;
int count;
/* USER CODE END 1 */
由于是通过串口1,所以要是需要用到串口的接收和发送的。
详细的见代码
int main(void)
{
/* USER CODE BEGIN 1 */
DB_R[0] = 0x0102;
DB_R[1] = 0x0204;
DB_R[2] = 0x0306;
DB_R[3] = 0x0408;
int count;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,&RxByte,1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */