qt串口通信接收数据不完整_qt串口接收数据

qt串口通信接收数据不完整_qt串口接收数据高通QM215高速串口调试总结参考文档硬件和复用情况确认修改如下串口调试测试程序代码:将串口设置为高速串口,AP端收到的数据一直为0XFD参考文档1、sp80-pk881-6_a_qm215_linux_android_software_porting_manual.pdf2、80-pk881-21_a_qm215_linux_peripheral_(uart,_spi,_i2c)_ove…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

参考文档

1、sp80-pk881-6_a_qm215_linux_android_software_porting_manual.pdf
2、80-pk881-21_a_qm215_linux_peripheral_(uart,_spi,_i2c)_overview.pdf
3、80-ne436-1_j_bam_low-speed_peripherals_for_linux_kernel_configuration_and_debugging_guide.pdf

硬件和复用情况确认

首先确认要使用的UART号,得到其使用的TX,RX,TXS,RXS,并查看是否被复用为其他功能引脚,如SPI、SIM等等
以QM215 UART6为例,其用到的引脚如下,使用到了gpio20,gpio21,gpio22,gpio23,且查看设备树,发现并未被复用为其他功能.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改如下

1、 msm-4.9/arch/arm64/boot/dts/qcom/msm8917-pinctrl.dtsi

//配置 gpio20 gpio21 gpio22 gpio23 功能为uart
blsp2_uart2 { 
   //uart6
	blsp2_uart2_active: blsp2_uart2_active { 
   
		mux { 
   
			pins = "gpio20", "gpio21","gpio22", "gpio23";
			function = "blsp_uart6";
		};

		config { 
   
			pins = "gpio20", "gpio21","gpio22", "gpio23";
			drive-strength = <2>;
			bias-disable;
		};
	};

	blsp2_uart2_sleep: blsp2_uart2_sleep { 
   
		mux { 
   
			pins = "gpio20", "gpio21","gpio22", "gpio23";
			function = "blsp_uart6";
		};

		config { 
   
			pins = "gpio20", "gpio21","gpio22", "gpio23";
			drive-strength = <2>;
			bias-disable;
		};
	};

};

2、msm-4.9/arch/arm64/boot/dts/qcom/msm8917.dtsi

//配置uart6为高速串口
blsp2_uart2: uart@7af0000 { 
   
	compatible = "qcom,msm-hsuart-v14";
	reg = <0x7af0000 0x200>,
		  <0x7ac4000  0x1f000>;
	reg-names = "core_mem", "bam_mem";
	interrupt-names = "core_irq", "bam_irq", "wakeup_irq";
	#address-cells = <0>;
	interrupt-parent = <&blsp2_uart2>;
	interrupts = <0 1 2>;
	#interrupt-cells = <1>;
	interrupt-map-mask = <0xffffffff>;
	interrupt-map = <0 &intc 0 307 0
					 1 &intc 0 239 0
					 2 &tlmm 21 0>;
	qcom,inject-rx-on-wakeup;
	qcom,rx-char-to-inject = <0xfd>;
	qcom,bam-tx-ep-pipe-index = <2>;
	qcom,bam-rx-ep-pipe-index = <3>;
	qcom,master-id = <84>;
	clock-names = "core_clk", "iface_clk";
	clocks = <&clock_gcc clk_gcc_blsp2_uart2_apps_clk>,
		<&clock_gcc clk_gcc_blsp2_ahb_clk>;
	pinctrl-names = "sleep", "default";
	pinctrl-0 = <&blsp2_uart2_sleep>;
	pinctrl-1 = <&blsp2_uart2_active>;
	qcom,msm-bus,name = "blsp2_uart2";
	qcom,msm-bus,num-cases = <2>;
	qcom,msm-bus,num-paths = <1>;
	qcom,msm-bus,vectors-KBps =
	<84 512 0 0>,
	<84 512 500 800>;
};

//配置uart6为低速串口
 blsp2_uart2: serial@7af0000 { 
   //uart6
	compatible = "qcom,msm-uartdm-v1.4",
				 "qcom,msm-uartdm";
	reg = <0x7af0000 0x200>;
	interrupts = <0 307 0>;
	clocks = <&clock_gcc clk_gcc_blsp2_uart2_apps_clk>,
	<&clock_gcc clk_gcc_blsp2_ahb_clk>;
	clock-names = "core", "iface";
	status = "disabled";
};

3、 msm-4.9/arch/arm64/boot/dts/qcom/qm215-qrd.dtsi

//使能UART6
&blsp2_uart2 { 
   
	status = "ok";
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&blsp2_uart2_active>;
	pinctrl-1 = <&blsp2_uart2_sleep>;
};

串口调试

编译并烧写成功,在dev目录下查看uart6是否生成.
高速串口:ttyHS*
低速串口:ttyMSM*
在这里插入图片描述

测试程序代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#include<strings.h>

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{ 
   
	struct termios newtio,oldtio;
	if( tcgetattr( fd,&oldtio)  !=  0) { 
   
	    perror("tcgetattr error");
	    return -1;
	}
	bzero( &newtio, sizeof( newtio ) );
	newtio.c_cflag  |=  CLOCAL | CREAD; 
	newtio.c_cflag &= ~CSIZE; 

	switch( nBits )
	{ 
   
	    case 7:
	        newtio.c_cflag |= CS7;
	        break;
	    case 8:
	        newtio.c_cflag |= CS8;
	        break;
	}

	switch( nEvent )
	{ 
   
	    case 'O':
	        newtio.c_cflag |= PARENB; 
	        newtio.c_cflag |= PARODD;  
	        newtio.c_iflag |= (INPCK | ISTRIP); 
	        break;
	    case 'E':
                newtio.c_iflag |= (INPCK | ISTRIP);
                newtio.c_cflag |= PARENB;
                newtio.c_cflag &= ~PARODD;
                break;
	    case 'N': 
	        newtio.c_cflag &= ~PARENB;
	        break;
	}

	switch( nSpeed )
	{ 
   
	    case 2400:
	        cfsetispeed(&newtio, B2400);
	        cfsetospeed(&newtio, B2400);
	        break;
	    case 4800:
	        cfsetispeed(&newtio, B4800);
	        cfsetospeed(&newtio, B4800);
	        break;
	    case 9600:
	        cfsetispeed(&newtio, B9600);
	        cfsetospeed(&newtio, B9600);
	        break;
	    case 115200:
	        cfsetispeed(&newtio, B115200);
	        cfsetospeed(&newtio, B115200);
	        break;
	    case 460800:
	        cfsetispeed(&newtio, B460800);
	        cfsetospeed(&newtio, B460800);
	        break;
			case 500000:
	        cfsetispeed(&newtio, B500000);
	        cfsetospeed(&newtio, B500000);
	        break; 
			case 576000:
	        cfsetispeed(&newtio, B576000);
	        cfsetospeed(&newtio, B576000);
	        break; 
			case 921600:
	        cfsetispeed(&newtio, B921600);
	        cfsetospeed(&newtio, B921600);
	        break;   
	    case 1000000:
	        cfsetispeed(&newtio, B1000000);
	        cfsetospeed(&newtio, B1000000);
	        break; 
	    case 1152000:
	        cfsetispeed(&newtio, B1152000);
	        cfsetospeed(&newtio, B1152000);
	        break;
	    default:
	        cfsetispeed(&newtio, B9600);
	        cfsetospeed(&newtio, B9600);
	        break;
	}

	if( nStop == 1){ 
   
	    newtio.c_cflag &=  ~CSTOPB; 
	}else if ( nStop == 2 ){ 
   
	    newtio.c_cflag |=  CSTOPB;
	} 
	newtio.c_cc[VTIME]  = 0;
	newtio.c_cc[VMIN] = 0;
	tcflush(fd,TCIFLUSH); 
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{ 
   
	    perror("set error");
	    return -1;
	}
	return 0;
}

int main(int argc,char *argv[])
{ 
   
	int fd,ret_set,ret_read,ret;
	char buf_read[1024];
	char buf_write[1024];
	char tty[20]="/dev/";
	if(3 < argc)
	{ 
   
	    strcat(tty,argv[1]);
	    fd = open(tty, O_RDWR);
	    if(fd == -1)
	    { 
   
				printf("Open %s failed! Exit!\n",tty);
				exit(1);
	    }
	    printf("open %s successfully!\n",tty);

	    ret_set = set_opt(fd, atoi(argv[2]), 8, 'N', 1);
	    if (ret_set == -1)
	    { 
   
				printf("Set %s failed! Exit!\n",tty);
				exit(1);
	    }
	    printf("Set %s successfully!\n",tty);
	    printf("Baud rate: %s\n",argv[2]);
	    memset(buf_write, 0, sizeof(buf_write));	
	    memcpy(buf_write,argv[3],sizeof(buf_write));
	    buf_write[99] = '\n';
			printf("Data: %s, size: %lu\n",buf_write,strlen(buf_write));		
	    while (1)
	    { 
    
	        memset(buf_read, 0, sizeof(buf_read));
	        ret = write(fd, buf_write, strlen(buf_write)+1);
					if( ret > 0){ 
   
		   			printf("Write data: %s\n",buf_write);
	        }else{ 
   
				    printf("Write data failed! Exit!\n");
				    exit(1);
					}
	        ret_read = read(fd, buf_read, 100);
	        if(ret_read > 0){ 
   
	            printf("Read data: %s\n\n", buf_read);
	        }
	        sleep(3);
	    }
			close(fd);
	}else{ 
   
	    printf("Usage: uart [tty node] [baud rate] [data] [data size < 1024]\n");
	    printf("Sample: uart ttyHSL1 115200 test\n");
	}
 return 0;
}

短接TX和RX,运行测试程序,得到以下结果,uart调试成功
在这里插入图片描述

将串口设置为高速串口,AP端收到的数据一直为0XFD

将串口设置为高速串口,与电脑通信,则AP端收到的数据一直为0XFD(原因不明),修改msm-4.9/drivers/tty/serial/msm_serial_hs.c如下,接收发送皆正常.
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183632.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月10日 上午10:00
下一篇 2022年10月10日 上午10:00


相关推荐

  • navicat premium 15 激活【2021免费激活】

    (navicat premium 15 激活)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0VOERWDQ5R-eyJsa…

    2022年3月31日
    132
  • java冒泡排序代码_Java冒泡排序

    java冒泡排序代码_Java冒泡排序一、冒泡排序:利用冒泡排序对数组进行排序二、基本概念:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2…

    2022年7月8日
    16
  • pycharm 批量修改变量名

    pycharm 批量修改变量名背景 当代码已经写得差不多 需要修改某个变量名时 挨个修改太麻烦了 可通过下述方法进行批量修改 如下介绍 方法一 rename 方法 1 把光标移动到要修改的变量名称上 2 右键 refactor rename 确定 3 在弹出来的框中 选择 renamecodeoc 即修改所有重复出现的变量名 4 变量周围出现红色框 修改变量 确定 5 其他位置的该变量会被同时修改

    2026年3月27日
    2
  • 推荐算法之NMF算法

    推荐算法之NMF算法在例如Netflix或MovieLens这样的推荐系统中,有用户和电影两个集合。给出每个用户对部分电影的打分,希望预测该用户对其他没看过电影的打分值,这样可以根据打分值为其做出推荐。NMF(non-negativematrixfactorization)的基本思想可以简单描述为:对于任意给定的一个非负矩阵A,NMF算法能够寻找到一个非负矩阵U和一个非负矩阵V,将一个非负的矩阵分解为左右…

    2022年6月17日
    35
  • Java反射机制及其使用

    Java反射机制及其使用文章目录1Java反射机制概述2反射及其使用2.1关于类java.lang.Class2.2类的加载2.2.1类的加载过程2.2.2类加载器2.3反射的使用2.3.1创建运行时类的对象2.3.2获取运行时类的属性结构2.3.3获取运行时类的方法结构2.3.4获取运行时类的构造器结构2.3.5获取运行时类的父类信息2.3.6获取运行时类实现的接口2.3.7获取运行时类声明的注解2.3.7获取运行时类所在的包2.3.8调用类的构造函数、操作类的属性、调用类中方法1Java

    2022年7月8日
    19
  • leetcode 堆排序_leetcode合并两个有序数组

    leetcode 堆排序_leetcode合并两个有序数组给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:lists = []输

    2022年8月8日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号