企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 说明 linux是一个文件系统,设备也是文件,我们可以像使用文件那样来访问我们的设备,在linux下进行串口调试,可以直接使用shell来实现,并且根据开发需要,可以编写自己的shell。 ## 串口参数配置 通过stty工具设置串口参数,例如 ```bash stty -F /dev/ttyUSB0 raw speed 9600 -echo min 0 time 10 ``` 上例设置了ttyUSB0设备的数据流格式为raw,波特率9600,-echo表示不回显输入字符(-号在选项前面表示否定),min 0 表示读取内容时最少读取0个字符, time 10 表示读取执行结果时的超时时间是10/10秒,如果为time 1则此超时时间为1/10秒。不设置读取的超时时间,读取操作不能自动结束。更多选项详见stty的帮助信息。 ## 向串口写(输入)命令(数据) ```bash echo -e "数据" > /dev/ttyUSB0 ``` ## 读取串口的回显 ```bash  cat /dev/ttyUSB0 ``` ## 按十六进制数据进行发送 把16进制数据0xdd 0xff 发送到/dev/ttyUSB0里去 ```bash echo -e -n "\xdd\xff" > /dev/ttymxc0 ``` * -e:表示便能“\”反斜杠,“\x”表示后边的数据为16进制,更多细节 man echo * -n:表示不添加换行符“0x0A” ## 配合FPGA获取FPGA内部的数据 此处简单记录,这是调试高速AD芯片LTC2357时使用的一种方式! bash脚本: ```bash #!/usr/bin/env bash #------------------------------------------------------- # FileName : usb.sh # Author :hpy # Date :2020年08月09日 # Description : #------------------------------------------------------- getData(){ stty -F /dev/ttyUSB0 raw speed 9600 -echo min 0 time 10 &> /dev/null case $1 in 0)sendbuf="\x60\xcc";; 1)sendbuf="\x61\xcc";; 2)sendbuf="\x62\xcc";; 3)sendbuf="\x63\xcc";; "*")exit 1;; esac cnt=23 while [[ $cnt -ge 0 ]] do t=$(printf "%x" $cnt ) #十进制数据转十六进制数据显示 sendbuf="$sendbuf\x$t" cnt=$[$cnt-1] done #echo $sendbuf echo -e -n "$sendbuf" >/dev/ttyUSB0 rec="ch$1 : $(cat -v /dev/ttyUSB0)" echo $rec #sleep 1 } main(){ getData 0 getData 1 getData 2 getData 3 exit 0 } main ``` FPGA串口关键部分: ```verilog //+++++++++++++++++ 串口模块 +++++++++++++++++++++++ reg [7:0] tx_data; wire [7:0] rx_data; reg [23:0] tmp; //assign tmp = 8'b11001010; //ascii=8'h60 锁存即将发送到上位机的ad数据 always@(posedge clk_in) begin tmp = (rx_data==8'h60) ? ad_data0 : (rx_data==8'h61) ? ad_data1 : (rx_data==8'h62) ? ad_data2 : (rx_data==8'h63) ? ad_data3 :tmp ; //tmp=24'haaaaaa; /* case(rx_data) // 选通ch0 ~ ch1 8'h60:tmp = ad_data0; 8'h61:tmp = ad_data1; 8'h62:tmp = ad_data2; 8'h63:tmp = ad_data3; default: tmp = tmp; endcase */ end //转换数据 -- 实现发送到上位机 always@(rx_data) begin if(rx_data >= 8'd0 && rx_data < 8'd24 )begin //处理需要发送的数据 tx_data = 8'h30 + ((tmp >> rx_data) & 24'd1 ) ; end else begin tx_data = 8'h20; //空格的ascii end end Uart_Bus #(.BPS_PARA(1250) //当使用12MHz时钟时波特率参数选择1250对应9600的波特率 ) Uart_Debug( .clk_in(clk_in), //系统时钟 .rst_n_in(rst_n_in), //系统复位,低有效 .rs232_rx(rs232_rx), //FPGA中UART接收端,分配给UART模块中的发送端TXD .rs232_tx(rs232_tx), //FPGA中UART发送端,分配给UART模块中的接收端RXD .rx_data(rx_data), .tx_data(tx_data) ); ``` 运行效果: ![](https://img.kancloud.cn/2d/17/2d17c294e03dea86c0efd396c3b18820_872x162.png)