0%

python3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import time
import serial

#RS232指令,使用一个字典,把需要被操作的RS232命令封装到一起
RS232_Command = {
'command_hex1': 'A5 5A 03 00 03',
'command_hex2': '6B 30 31 73 50 32 30 30 0D',
}

#把16进制的数据转换为bytes数据流进行发送,RS232命令发送函数
def serial_sent_hex(command):
#bytes.fromhex(),使用这个函数进行数据转换,可以把16进制的数值转换字节数据(即比特流,字符串与比特流间还可以用encode()和decode()进行编解码)
var = bytes.fromhex(RS232_Command["%s" % command])
ser.write(var)
data = ser.read(10)
# 获取指令的返回值,并且进行类型转换,转换为字符串后便可以进行字符串对比,因而便可以根据返回值进行判断是否执行特定功能
data = str(data, encoding="utf-8")
return data

if __name__ == '__main__':
#实现串口的连接
ser = serial.Serial('COM29', 9600, timeout=3)
command_hex1 = serial_sent_hex('command_hex1')
#command_hex2 = serial_sent_hex('command_hex2')
阅读全文 »

CAN总线是指控制器局域网,是一种实时性能极高的网络协议,广泛应用于汽车、工业控制、医疗仪器等领域。在CAN总线网络设计中,总线负载率是一个非常重要的指标,它能够帮助工程师们评估网络的性能和可靠性。本文将详细介绍CAN总线负载率的计算方法。

一、CAN总线负载率的定义

CAN总线负载率,指的是在一个特定时间内,总线上发送和接收数据的比率。如果总线的负载率过高,就会导致数据冲突、错误和延迟等问题,最终降低网络的性能和可靠性。

二、CAN总线负载率计算方法

CAN总线负载率的计算方法相对简单,主要需要知道以下三个参数:

  1. 数据帧长度

数据帧长度是指CAN总线上传输的数据字节数,每个数据帧共有8个字节。在CAN总线网络设计中,数据帧长度通常会提前预设。

  1. 数据帧发送速率

数据帧发送速率是指数据帧在总线上传输的速率,通常以每秒钟发送的帧数来计算。在CAN总线网络设计中,数据帧发送速率也可以提前预设。

  1. 总线容量

总线容量是指CAN总线上传输数据的最大容量,通常以bit/s为单位来计算。在CAN总线网络设计中,总线容量也会提前预设。

阅读全文 »

CAN发送接收示例

CAN发送数据命令

1
cansend can0 123#11.22

cansend是命令,can0是参数,123是ID,#分隔符,11.22是发送数据。

CAN接收:接收需要另外开一个终端

1
candump can0

candump 是命令,can0是参数,表示哪个设备,这个命令是阻塞型的,会一直等待接收。

CAN工具安装调试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uname -r                    # 应该能看到自己起的CONFIG_LOCALVERSION
lsusb # 要能看到插入的usb转can,是ttyACM0或者gs_usb之类的,不然是usbipd没装对

sudo apt install can-utils
sudo modprobe can
sudo modprobe can-raw

# 如果是slcan的固件

sudo modprobe slcan
sudo slcand -o -c -s0 /dev/ttyACM0 can0
sudo ifconfig can0 up
ifconfig # 应该能看到can0了

sudo ifconfig can0 txqueuelen 1000
cansend can0 999#DEADBEEF # Send a frame to 0x999 with payload 0xdeadbeef
candump can0 # Show all traffic received by can0

# 如果用的是candlelight

sudo modprobe gs_usb
ip link set can0 up type can bitrate 500000
ifconfig # 应该能看到can0了

1、配置can0,设置比特率

1
sudo ip link set can0 type can bitrate 250000

2、打开can0

1
sudo ip link set can0 up

3、查看信息

1
ip -details link show can0

4、ifconfig

关闭

1
sudo ifconfig can1 down

参考资料
https://blog.csdn.net/qq_41661878/article/details/129038794
https://blog.csdn.net/weixin_43849483/article/details/130454760
https://blog.csdn.net/gjy_skyblue/article/details/131322358
https://zhuanlan.zhihu.com/p/611724997
https://blog.csdn.net/u010443710/article/details/106834961?spm=1001.2014.3001.5501
https://blog.csdn.net/u010443710/article/details/107476570?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-5-107476570-blog-106834961.235^v38^pc_relevant_anti_vip&spm=1001.2101.3001.4242.4&utm_relevant_index=8
https://cloud.tencent.com/developer/article/1902433?areaSource=102001.19&traceId=-2_c0P3YX14MQMjVQtfcf

简介

Linux内核已经集成LED灯驱动。Linux内核的LED灯驱动采用platform框架,因此我们只需要在设备树文件中添加相应LED节点即可;接下来我们学习如何在全志a40i平台下使用Linux内核自带的LED驱动来驱动 board 上LED。

开发环境介绍

主机操作系统:Ubuntu14.04 64位
目标平台:A40I (ARM Cortex-A7)
交叉工具链:arm-linux-gnueabi,gcc5.3.1
内核版本:3.10

使能Linux内核自带的LED驱动

使用Linux内核自带的LED灯驱动首先需要配置Linux内核,使能自带的LED灯驱动;使能方法如下:

阅读全文 »

环境:Unbuntu20.4LTS
交叉编译工具链:arm-linux-gnueabihf-gcc
软件:VsCode

编译环境搭建及测试

下载交叉编译器

工具地址:https://releases.linaro.org/components/toolchain/binaries/
比如gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
完整路径:
https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

安装

先解压

1
2
xz -d gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar

阅读全文 »

C标准时间函数库头文件:

1
#include <time.h>

数据结构:

1
2
3
4
5
6
7
8
9
10
11
struct tm {
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推 */
int tm_year; /* 自 1900 年起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};

由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:

阅读全文 »

EVT例程中提供了两种OTA方式,在EVT中BLE目录下有一个PDF说明:WCH蓝牙空中升级(BLE OTA)

方式二是不带库升级,整个codeflash分成四个区域,Jump IAP,APP,IAP,LIB

Jump IAP为4K,用来跳入到IAP中,此工程main中并无函数,会直接跳转到IAP,IAP的起始地址修改后,此工程启动文件中的地址也需对应修改为IAP的起始地址,APP为44K,设置这个大小的原因是为了使一些192Kflash的芯片也能直接使用OTA,此app部分可以不带有蓝牙功能,IAP为16K,它的作用就是将手机app发送的升级固件直接写到APP区域,LIB为573的是128K,583的是192K。

那么就有一个问题,对于448Kflash的芯片,该如何扩大APP区域呢?

如果想要扩大,需要按照下面的步骤修改:

阅读全文 »