正点原子uart数据包收发实验例程修改---uart通信verilog实现1

目录

通信协议的制定

修改方案

        修改地方1:如果没有特殊需求的话,数据长度的增加,输出口数量也应相应地增加,因此需要根据自己的需求增加相应输出端口。

        修改地方2:增加数据长度

        修改地方3:对数据进行解析,修改处2作为参

前言,正点原子的uart数据包收发实验例程程序只能实现数据长度为1的数据包接收,在实际中数据长度1是很难满足需求,因此需要对其进行修改。

本文章主要针对接收模块进行修改,若要看如何修改发送请转移到正点原子uart数据包收发实验例程修改---uart通信verilog实现2icon-default.png?t=N7T8https://blog.csdn.net/MR_Colorful/article/details/140072411?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22140072411%22%2C%22source%22%3A%22MR_Colorful%22%7D

通信协议的制定

        通信协议一般包括包头、命令、数据长度、数据与校验等,如表 所示:
 
         包头:包头用于表示一帧的开始,此处我们定义为 8’h55;
        命令:命令用来区分本次数据包的类型,如发送控制命令或者查询命令,本实验主要定义四种命令,        
        数据长度:定义后面紧跟着的数据字段的字节数;
        数据:接收的有效数据;
        校验:用来校验数据包的内容是否正确,本次采用的校验算法为校验和(Checksum),即 将包头、命 令、数据长度和数据进行累加,并取低 8 位作为校验的结果。 接收方通过对比自己计算的校验值和接收到 的校验值是否一致,来判断校验结果是否正确。

修改方案

只需在packet_decode模块进行修改,其余模块无需进行修改。

修改地方1:如果没有特殊需求的话,数据长度的增加,输出口数量也应相应地增加,因此需要根据自己的需求增加相应输出端口。

修改地方2:增加数据长度

        在//reg define注释进行修改

//reg define
reg [5:0] cur_state;  //状态机的现态
reg [5:0] next_state;  //状态机的次态
reg [2:0] data_cnt;  //接收到的数据计数器
reg [7:0] data_len;  //接收的有效数据长度
//-----修改处1-------
reg [7:0] rec_data;  //接收到的数据,表最后一个数据
reg [7:0] rec_data_t0;  //接收的数据寄存一拍,表倒二个数据
reg [7:0] rec_data_t1;
......
reg [7:0] rec_data_tn;//接收的数据寄存n拍,表第一个数据
//-----修改处1-------
reg [7:0] checksum;  //包的累加校验和
reg       skip_en;  //控制状态跳转使能信号

修改地方3:对数据进行解析,修改处2作为参考

	  //接收完成后处理数据
	  always @(posedge clk or negedge rst_n) begin
	    if (!rst_n) begin
	      led_data   <= 2'b0;
	      beep_data  <= 1'b0;
	      breath_sw  <= 1'b0;
	      breath_fre <= 8'b0;
	      cur_mode   <= uart_wait;
	    end else if ((parse_result == PARSE_OK) && (parse_done == 1'b1)) begin
	      //解析命令
	      if (parse_cmd == LED_CMD) begin  //灯
	        led_data <= {rec_data[4], rec_data[0]};
	      end else if (parse_cmd == BEEP_CMD) begin
	        cur_mode[0] <= ((rec_data[0]) ? breath_open : breath_close);
	        beep_data   <= rec_data[0];
	      end else if (parse_cmd == BREATH_LED_CMD) begin
	        breath_sw   <= rec_data_t0[0];
	        breath_fre  <= rec_data;
	        cur_mode[1] <= ((rec_data_t0[0]) ? breath_open : breath_close);
	      end 
          //----修改处2------------
          else if (parse_cmd == CAR_CMD) begin
	        car_sw   <= rec_data_t0[0];
	        car_ctl  <= rec_data;
	        cur_mode <= car_ctl;
	      end else if (parse_cmd == ARM_CMD) begin
	        arm_sw  <= rec_data_t1;  
	        arm_aim <= rec_data_t0;  
	        arm_pro <= rec_data;  
	      end
          //----修改处2------------
	    end
	  end

             

  • 27
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值