【STM32MP157应用编程】4.串口接收、发送数据
创始人
2024-05-31 02:41:31
0

目录

串口文件

指令操作串口

程序操作串口

程序说明

程序代码

4_ChuanKou_2.c

启动交叉编译工具

编译

拷贝到开发板

测试

串口文件

在/dev目录下,存放了串口的文件。

文件名对应的串口
ttySTM0CH340
ttySTM1com2(公头)
ttySTM2com1(母头)
ttySTM3被开发板的蓝牙所使用(不可用)

 注意:文件名的命名只跟驱动有关。

指令操作串口

设置com1串口波特率为115200。

stty -F ttySTM2 115200

 向com1串口发送数据。

echo aaa > ttySTM2

 

 

 com1串口接收数据。

cat ttySTM2

 

程序操作串口

程序说明

参数1:串口文件序号。

        0:ttySTM0。

        1:ttySTM1。

        2:ttySTM2。

参数2:波特率。

程序代码

4_ChuanKou_2.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include //./xxx 1 115200int main(int argc, char *argv[])
{//检查参数个数if (argc != 3){printf("%s文件的参数个数错误!\n", argv[0]);return -1;}//检查参数1是否为纯数字char *endptr;strtol(argv[1], &endptr, 10);if ((endptr == argv[1]) || ((!isspace(*endptr)) && (*endptr != '\0'))){perror("参数1错误!\n");return -1;}endptr = NULL;//检查参数2是否为纯数字strtol(argv[2], &endptr, 10);if ((endptr == argv[2]) || ((!isspace(*endptr)) && (*endptr != '\0'))){perror("参数2错误!\n");return -1;}//检查参数1的取值范围:<3if (atol(argv[1]) >= 3){perror("参数1错误!\n");return -1;}char tty_path[100];sprintf(tty_path, "/dev/ttySTM%s", argv[1]);int fd = open(tty_path, O_RDWR | O_NOCTTY);if (fd < 0){printf("打开%s失败!\n", tty_path);return -1;}//获取串口文件属性,以便于修改相应的属性struct termios options;if (tcgetattr(fd, &options) < 0){printf("获取串口属性错误!\n");return -1;}//设置波特率if (strcmp(argv[2], "50") == 0){cfsetispeed(&options, B50); //设置串口输入波特率cfsetospeed(&options, B50); //设置串口输出波特率}else if (strcmp(argv[2], "75") == 0){cfsetispeed(&options, B75); //设置串口输入波特率cfsetospeed(&options, B75); //设置串口输出波特率}else if (strcmp(argv[2], "110") == 0){cfsetispeed(&options, B110); //设置串口输入波特率cfsetospeed(&options, B110); //设置串口输出波特率}else if (strcmp(argv[2], "134") == 0){cfsetispeed(&options, B134); //设置串口输入波特率cfsetospeed(&options, B134); //设置串口输出波特率}else if (strcmp(argv[2], "150") == 0){cfsetispeed(&options, B150); //设置串口输入波特率cfsetospeed(&options, B150); //设置串口输出波特率}else if (strcmp(argv[2], "200") == 0){cfsetispeed(&options, B200); //设置串口输入波特率cfsetospeed(&options, B200); //设置串口输出波特率}else if (strcmp(argv[2], "300") == 0){cfsetispeed(&options, B300); //设置串口输入波特率cfsetospeed(&options, B300); //设置串口输出波特率}else if (strcmp(argv[2], "600") == 0){cfsetispeed(&options, B600); //设置串口输入波特率cfsetospeed(&options, B600); //设置串口输出波特率}else if (strcmp(argv[2], "1200") == 0){cfsetispeed(&options, B1200); //设置串口输入波特率cfsetospeed(&options, B1200); //设置串口输出波特率}else if (strcmp(argv[2], "1800") == 0){cfsetispeed(&options, B1800); //设置串口输入波特率cfsetospeed(&options, B1800); //设置串口输出波特率}else if (strcmp(argv[2], "2400") == 0){cfsetispeed(&options, B2400); //设置串口输入波特率cfsetospeed(&options, B2400); //设置串口输出波特率}else if (strcmp(argv[2], "2400") == 0){cfsetispeed(&options, B2400); //设置串口输入波特率cfsetospeed(&options, B2400); //设置串口输出波特率}else if (strcmp(argv[2], "4800") == 0){cfsetispeed(&options, B4800); //设置串口输入波特率cfsetospeed(&options, B4800); //设置串口输出波特率}else if (strcmp(argv[2], "9600") == 0){cfsetispeed(&options, B9600); //设置串口输入波特率cfsetospeed(&options, B9600); //设置串口输出波特率}else if (strcmp(argv[2], "19200") == 0){cfsetispeed(&options, B19200); //设置串口输入波特率cfsetospeed(&options, B19200); //设置串口输出波特率}else if (strcmp(argv[2], "38400") == 0){cfsetispeed(&options, B38400); //设置串口输入波特率cfsetospeed(&options, B38400); //设置串口输出波特率}else if (strcmp(argv[2], "57600") == 0){cfsetispeed(&options, B57600); //设置串口输入波特率cfsetospeed(&options, B57600); //设置串口输出波特率}else if (strcmp(argv[2], "115200") == 0){cfsetispeed(&options, B115200); //设置串口输入波特率cfsetospeed(&options, B115200); //设置串口输出波特率}else if (strcmp(argv[2], "230400") == 0){cfsetispeed(&options, B230400); //设置串口输入波特率cfsetospeed(&options, B230400); //设置串口输出波特率}else if (strcmp(argv[2], "460800") == 0){cfsetispeed(&options, B460800); //设置串口输入波特率cfsetospeed(&options, B460800); //设置串口输出波特率}else if (strcmp(argv[2], "500000") == 0){cfsetispeed(&options, B500000); //设置串口输入波特率cfsetospeed(&options, B500000); //设置串口输出波特率}else if (strcmp(argv[2], "576000") == 0){cfsetispeed(&options, B576000); //设置串口输入波特率cfsetospeed(&options, B576000); //设置串口输出波特率}else if (strcmp(argv[2], "921600") == 0){cfsetispeed(&options, B921600); //设置串口输入波特率cfsetospeed(&options, B921600); //设置串口输出波特率}else if (strcmp(argv[2], "1000000") == 0){cfsetispeed(&options, B1000000); //设置串口输入波特率cfsetospeed(&options, B1000000); //设置串口输出波特率}else if (strcmp(argv[2], "1152000") == 0){cfsetispeed(&options, B1152000); //设置串口输入波特率cfsetospeed(&options, B1152000); //设置串口输出波特率}else if (strcmp(argv[2], "1500000") == 0){cfsetispeed(&options, B1500000); //设置串口输入波特率cfsetospeed(&options, B1500000); //设置串口输出波特率}else if (strcmp(argv[2], "2000000") == 0){cfsetispeed(&options, B2000000); //设置串口输入波特率cfsetospeed(&options, B2000000); //设置串口输出波特率}else if (strcmp(argv[2], "2500000") == 0){cfsetispeed(&options, B2500000); //设置串口输入波特率cfsetospeed(&options, B2500000); //设置串口输出波特率}else if (strcmp(argv[2], "3000000") == 0){cfsetispeed(&options, B3000000); //设置串口输入波特率cfsetospeed(&options, B3000000); //设置串口输出波特率}else if (strcmp(argv[2], "3500000") == 0){cfsetispeed(&options, B3500000); //设置串口输入波特率cfsetospeed(&options, B3500000); //设置串口输出波特率}else if (strcmp(argv[2], "4000000") == 0){cfsetispeed(&options, B4000000); //设置串口输入波特率cfsetospeed(&options, B4000000); //设置串口输出波特率}else{printf("波特率参数错误!\n");return -1;}//设置串口属性if (tcsetattr(fd, TCSANOW, &options) < 0){printf("设置串口属性错误!\n");return -1;}printf("设置串口完成!\n");printf("串口启动!\n");//创建进程,读写串口功能分开pid_t jin_cheng = fork();if (jin_cheng < 0){printf("创建进程错误!\n");return -1;}else if (jin_cheng == 0) //子进程{char data[1024];int num = 0;while (1){while ((num = read(fd, &data, 1024)) != 0){printf("读取到的数据为:%s\n", data);memset(data, '\0', strlen(data));num = 0;read(fd, &data, 1024); //读掉最后的停止位}}}else if (jin_cheng > 0) //父进程{char data[1024];while (1){scanf("%s", data);getchar();write(fd, data, strlen(data));memset(data, '\0', strlen(data));}}close(fd);return 0;
}

启动交叉编译工具

source /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

编译

${CC} -o 4_ChuanKou_2 4_ChuanKou_2.c 

拷贝到开发板

scp 4_ChuanKou_2 root@10.3.22.219:/home/root/Linux_C_YingYong_BianCheng/JiaoCheng/4_ChuanKou/

 

测试

使用com1串口进行数据收发,设置波特率为115200。

./4_ChuanKou_2 2 115200

 发送数据。

 

 接收数据。

相关内容

热门资讯

格式化 恢复目录-格式化恢复目... 哎呀,说到“格式化恢复目录”,我这心里就五味杂陈啊!想当年,电脑出问题,目录乱七八糟,真是让人头疼。...
android手机模型-安卓手... 哎呀,说到安卓手机模型,我这心里就五味杂陈啊!你知道吗,每次看到那些新出的手机模型,我这小心脏就扑通...
完全性卒中:生活的急刹车,我们... 完全性卒中,这个词听起来就像是从天而降的噩梦,不是吗?想象一下,就在你以为一切如常,生活按部就班的日...
linux下制作u盘启动盘-在... 嘿,各位小伙伴们,今天咱们来点不一样的!你是不是还在为怎么在Linux下制作U盘启动盘而头疼?别担心...
帝国cms 新闻触屏模板-帝国... 哎呀呀,说到这个帝国CMS的新闻触屏模板,我简直要跳起来了!这可不是一般的模板,它是新闻界的小鲜肉,...
windows xp sp3日... 哎呀,说到WindowsXPSP3的日文补丁,我这心里就五味杂陈啊!想当年,这可是我们电脑小白的救星...
雨林xp sp3 序列号-雨林... 哎呀,说到雨林XPSP3序列号,我这心里就激动得不得了!你知道吗,每次看到那些闪闪发光的数字和字母组...
苹果wwdc ppt-苹果 W... 哎呀,说到苹果的WWDC,那真是让人激动得不得了!每次看到那些闪闪发光的PPT,我就感觉自己像是走进...
杭州花圃的老种绿云:传承百年的... 哎呀,说到杭州的花圃啊,我这心肝儿就扑通扑通跳得厉害!特别是那老种绿云,真是让人一见倾心。这花啊,不...
中央15音乐频道节目表-中央 ... 哟,说到中央15音乐频道,那可是我每天的精神食粮啊!从早到晚,这个频道的节目表简直就是一场不停歇的音...
win8系统cad-Win8 ... 哎呀呀,说到这个Win8系统上用CAD,我这心里啊,五味杂陈!你懂的,CAD这玩意儿,对我们这些搞设...
svchostexe内存错误-... 哎呀,说到这个“svchost.exe”内存错误,真是让人头疼得不得了!每次一打开电脑,它就开始闹小...
克罗恩不治能活多久-克罗恩病虽... 克罗恩病,这个名字听起来就让人心生畏惧。我不是医生,也不是研究员,我只是一个经历过克罗恩病痛苦的人。...
神秘的 statreport.... 哎呀,说到这个statreport.dll,我就觉得它有点神秘兮兮的。每次打开电脑,它就在那里,默默...
格式化手机能恢复吗-手机格式化... 哎呀呀,真是急死人了!手机突然就格式化了,里面的照片、聊天记录、那些珍贵的回忆,一下子全都不见了!这...
中医治疗胃溃疡:整体调理与平衡... 哎呀,说到胃溃疡,这可不是什么小病啊!每次胃痛起来,简直就像是有个小人在你肚子里打鼓,痛得你直冒冷汗...
win10专业版u盘安装-Wi... 哎呀,说到这个Win10专业版的U盘安装,真是让我又爱又恨啊!你想想,每次电脑卡得像乌龟爬,心里那个...
笔记本用u盘安装win7系统-... 嘿,大家好!今天我要和大家分享一个超实用的小技巧——用U盘给笔记本安装Win7系统。是不是觉得听起来...
libeay32dll下载 微... 哎呀,今天真是倒霉透顶了!想打开电脑玩游戏,结果蹦出来一个大大的错误提示,说什么“找不到Libeay...
超凡蜘蛛侠2反派-超凡蜘蛛侠 ... 哟,大家好,我今天得好好聊聊《超凡蜘蛛侠2》里那些让人又爱又恨的反派角色。这部电影,不吹不黑,反派们...