0%

最近有项目需要用到RK3568的GPIO进行功能开发,找到关于GPIO操作例程,特此记录一下,例程是基于英伟达开发板的,简单修改一下就可以应用到RK3568,中间可能需要修改设备树,这里略过设备树修改,以后会再专门讲解
首先使用shell命令测试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo 192 > /sys/class/gpio/export
#导出编号为192的gpio
#如果这个gpio导出成功,会多出一个文件夹/sys/class/gpio/gpio192/
echo 192 > /sys/class/gpio/unexport
#取消导出

echo out > /sys/class/gpio/gpio192/direction
#设置为输出
echo 1 > /sys/class/gpio/gpio192/value
#输出高

echo in > /sys/class/gpio/gpio192/direction
#设置为输入
cat /sys/class/gpio/gpio192/value
#读取输入值

#也可以直接向value中写入high或low,gpio被设置成输出,并输出对应电平
echo high > /sys/class/gpio/gpio192/value
#设置为输出,并输出高电平

#上述命令都会需要root权限

每个芯片都有自己的gpio编号计算公式,需要先将引脚编号转换成数字编号再进行操作

阅读全文 »

在Linux C编程中,获取时间是一个常见的需求。可以使用系统提供的函数来获取当前时间,以及进行时间的格式化和计算。下面将详细介绍如何在Linux C中获取时间。

1. 获取当前时间

要获取当前时间,可以使用time函数。time函数返回自1970年1月1日以来经过的秒数。示例代码如下:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <time.h>

int main() {
time_t Time;
time(&Time);
printf("当前时间:%s", ctime(&Time));
return 0;
}

上述代码中,time函数将当前时间的秒数保存在Time变量中,然后使用ctime函数将其转换为可读的字符串格式并打印出来。

阅读全文 »

如果您正在使用C语言编程,并需要在JSON数据中增加值,本文将为您提供一种方法。在C语言中,我们可以使用第三方库,如 cJSON 来处理JSON数据。下面是一个简单的例子,演示如何在一个JSON数组中增加值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <cJSON.h>
int main()
{
char* json_str = "[{\"name\":\"Bob\",\"age\":25},{\"name\":\"Alice\",\"age\":22}]";
cJSON* json = cJSON_Parse(json_str);
if (!json)
{
printf("Error before: [%s]\n",cJSON_GetErrorPtr());
}
else
{
cJSON* new_person = cJSON_CreateObject();
cJSON_AddStringToObject(new_person, "name", "Charlie");
cJSON_AddNumberToObject(new_person, "age", 28);
cJSON_AddItemToArray(json, new_person);
char* new_json_str = cJSON_Print(json);
printf("%s\n", new_json_str);
free(new_json_str);
cJSON_Delete(json);
}
return 0;
}

在这个例子中,我们首先定义了一个 JSON 字符串,包含两个人的信息。然后,我们使用 cJSON_Parse 方法将其解析为一个 cJSON 对象。接下来,我们创建了一个新的 cJSON 对象,表示一个新的人。使用 cJSON_AddStringToObject 和 cJSON_AddNumberToObject 方法,我们向新 cJSON 对象中添加了姓名和年龄属性。最后,使用 cJSON_AddItemToArray 方法,我们将新 cJSON 对象添加到原先的 JSON 数组中。最后,将修改后的 JSON 对象打印出来。

在这个例子中,我们演示了如何使用 cJSON 库来向 JSON 数组中增加值。当然,您可以根据您的需要修改这个示例,实现不同的操作。

播放音频文件分两种情况:

一、单纯播放音频文件推荐操作简单使用方便(sox软件、madplay库)。
sox软件播放音频

1、ubuntu安装命令

1
2
sudo apt-get install sox                       // 工具。
sudo apt-get install libsox-fmt-all // 包含MP3的解码器和其他格式的解码器。

2、代码通过系统 system 播放(play是sox软件播放的命令)

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
int main() {
system("play 1.mp3");
printf("播放结束了 \n");
exit:
printf("按任意键退出 ...\n");
getchar();
return 0;
}

常用命令和说明推荐文档:
sox常用命令
sox-音频处理工具

madplay库(自己没有测试需要编译就搁置了,推荐网上现成的)

madplay安装及使用

二、想要控制采样率、通道等(alsa库)
阅读全文 »

由于项目中遇到需要发送http请求,然后再解析接收到的响应。大概在网上搜索了一下,有两个比较不错,分别是http-parserfast-http
http-parser是由C编写的工具;fast-http是大部分移植自http-parser,用lisp语言编写的,不太适合目前的项目。fast-http介绍文档《fast-http》。
有一篇文章《HTTP 协议解析库:fast-http》介绍了fast-http,并且和http-parser进行了简单比较,结论是fast-http更快,快一倍。

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
去掉字符串首尾的 \x20 \r \n 字符
by sincoder
*/
void clean_string(char *str)
{
char *start = str - 1;
char *end = str;
char *p = str;
while(*p)
{
switch(*p)
{
case ' ':
case '\r':
case '\n':
{
if(start + 1==p)
start = p;
}
break;
default:
break;
}
++p;
}
//现在来到了字符串的尾部 反向向前
--p;
++start;
if(*start == 0)
{
//已经到字符串的末尾了
*str = 0 ;
return;
}
end = p + 1;
while(p > start)
{
switch(*p)
{
case ' ':
case '\r':
case '\n':
{
if(end - 1 == p)
end = p;
}
break;
default:
break;
}
--p;
}
memmove(str,start,end-start);
*(str + (int)end - (int)start) = 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class Example(QWidget):

def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
btn = QPushButton('Button', self)
btn.clicked.connect(self.buttonClicked)
btn.resize(btn.sizeHint())
btn.move(50, 50)

self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Signal and slot')
self.show()

def buttonClicked(self):
print('Button clicked!')

if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

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