Android 串口调试_串口转usb需要驱动吗

Android 串口调试_串口转usb需要驱动吗本文背景:是真的不喜欢脑子记这些引脚,串口节点,动不动忘记了。1.首先记录一下硬件引脚—-tty节点对应关系2.找一组/dev/ttyHSL1,先测试一下自环,然后写个app,从app里面读写这个节点3.后续,通过串口和单片机通信,和esp8266通信,实现一个androidapp控制单片机硬件平台配置:平台:msm8909默认log串口:Board_KERNEL_CMDLINE.

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

Jetbrains全系列IDE稳定放心使用

本文背景:
         
        是真的不喜欢脑子记这些引脚,串口节点,动不动忘记了。
        
        1.首先记录一下硬件引脚----tty节点对应关系
        2.找一组/dev/ttyHSL1,先测试一下自环,然后写个app,从app里面读写这个节点
        3.通过串口和单片机通信

硬件平台配置:

平台:msm8909

默认log串口:Board_KERNEL_CMDLINE := console=ttyHSL0, 115200, n8

对应文件节点:/dev/ttyHSL1

———————————————–

1.串口的linux驱动配置 (/dev/ttyHSL1)

//msm8909.dtsi
blsp1_uart2:serial@78b0000 {
    compatible = "qcom,msm-lsuart-v14";
    reg = <0x78b0000 0x200>;
    interrupts = <0 108 0>;
    clocks = <&clock_gcc clk_gcc_blsp1_uart2_app_clk>
             <&clock_gcc clk_gcc_blsp1_ahb_clk>;
    clock-names = "core_clk", "iface_clk";
}

//msm8909-qrd.dtsi
&blsp1_uart2 {
    status = "ok";
    pinctrl-name = "default";
    pinctrl-0 = <hsuart_active>;
}

//msm8909-pinctrl.dtsi

blsp1_uart2_active {
    qcom,pins = <&gp 20>, <&gp 21>;
    qcom,num-grp-pins = <2>;
    qcom,pin-func = <3>;
    label = "blsp1_uart2_active";

    huart_active:default {
        drive-strength = <16>;
        bias-disable;
    };
};

blsp1_uart2_sleep {
    qcom,pins = <&gp 20>, <&gp 21>;
    qcom, num-grp-pins = <2>;
    qcom, pin-func = <0>;
    label = "blsp1_uart2_sleep";

    huart_sleep:sleep {
        drive-strength = <2>;
        bias-disable;
    };
};

碰到一个启不动的问题,很直接的,开机立马挂掉的,没有提示信息的(dtsi里面的错误)

Android 串口调试_串口转usb需要驱动吗

 编译了两次,发现了问题原因,这个uart和spi共引脚,默认的配置是配置了spi4个脚,我直接把spi另两个引脚去掉了,但是没有把qcom,num-grp-pins=<2>修改位2,如果只配2个脚,但是这个为4,会导致启动不了,log还没有信息,还挺不好发现的。

(实际中,dtsi导致启动不了,一种是语法错误导致进入fastboot,一种配置错误,莫名启动不了)

2.串口ttyHSL1的C测试程序 (ndk编译,可执行文件推到system/bin/测试)

#include <stdio.h>     
#include <stdlib.h>     
#include <unistd.h>
#include <sys/types.h> 
#include <sys/stat.h>  
#include <fcntl.h>    
#include <errno.h>      
#include <sys/time.h>
#include <time.h>
#include <string.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <stdint.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <string.h>
#include <assert.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>

#define msleep(x)	usleep(x * 1000)


/*
*	这里类似波特率,需要可以加上多个串口节点
*	
*/
int select_serial_node(int num, char* name)
{
	switch(num)
	{
		case 1:
			strcpy(name, "/dev/ttyHSL1");
			break;
		case 2:
			strcpy(name, "/dev/ttyHSL2");
			break;
		default:
			return -1;
	}
	
	return 0;
}

/*
*		
*   设置波特率,这里case没多写,就写 2 个常用的9600和 115200
*/
unsigned int set_baud_rate(int br)
{
	unsigned int baud;
	switch (br)
	{
		case 0:
			baud = B0;
			break;
		case 9600:
			baud = B9600;
			break;
		case 115200:
			baud = B115200;
			break;
		default:
			printf("input err:baud rate not support");
			return -1;
	}
	
	return baud;
}

int init_serial_device(char *name, int baud)
{
	int fd;
	int ret;
	struct termios options;
	
	fd = open(name, O_RDWR | O_NDELAY | O_NOCTTY);
	
	if(fd == -1) 
	{
		printf("%s: open error\n", name);
		return -1;
	}
	
	//函数tcgetattr,用于获取终端参数,到options变量
	ret = tcgetattr(fd, &options);
	if (-1 == ret)
		return -1;
	
	options.c_cflag &= ~CSIZE;		//屏蔽其他标志
	options.c_cflag |= CS8;			//数据8bit
	options.c_cflag &= ~PARENB;		//无校验
	options.c_cflag &= ~CSTOPB;		//设置1位停止位
	
	options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
	cfsetispeed(&options, baud);
	cfsetospeed(&options, baud);
	options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP |IXON);
	ret = tcsetattr(fd, TCSANOW, &options);
	if (-1 == ret)
		return -1;
	return fd;
}

void send_serial_data(int fd, char *ptr)
{
	int ret;
	ret = write(fd, ptr, strlen(ptr));
	msleep(10);
}

/*
*	ex:  ./ttyTest 1 115200 "hello JnhnChaos!"
*
*/
int main(int argc, char **argv)
{
	int fd;
	int bn;
	int ret;
	char serial_node_name[25];
	int serial_num;
	char message_s[128];
	
	speed_t baud;
	
	printf("qyc at main begin\n");

	if (argc != 4) 
	{
		printf("input error: args should be set to 4 !\n");
		exit(-1);
	}
	
	//ret = sscanf(argv[1], "%d", &serial_num);
	serial_num = atoi(argv[1]);
	memset(serial_node_name, 0, sizeof(serial_node_name));
	ret = select_serial_node(serial_num, serial_node_name);
	if(ret == -1) return -1;
	printf("qyc, serial_node_name == %s\n", serial_node_name);
	

	//ret = sscanf(argv[2], "%d", &bn);
	bn = atoi(argv[2]);
	baud = set_baud_rate(bn);
	if (ret == -1) return -1;
	
	
	if(strlen(argv[3]) > 128)
	{
		printf("input error: args 4 is too long!\n");
		exit(-1);
	}
	
	memset(message_s, 0, sizeof(message_s));
	memcpy(message_s, argv[3], strlen(argv[3]));
	printf("qyc, message will send == %s, len = %u\n", message_s, strlen(message_s));
	

	fd = init_serial_device(serial_node_name, baud);
	if (fd == -1) return -1;
	
	send_serial_data(fd, message_s);
	
	printf("qyc, end\n");
	return 0;
}

中间碰到一个问题,”stack corruption detected , Aborted” 一会儿死机了。。。。 

Android 串口调试_串口转usb需要驱动吗

看了半天,后来发现是serial_node_name的buf设置小了,

在select_serial_node函数里strcpy出现问题。。。。。。

(尽量还是分配大点吧,现在的机器咱不缺那一点)

预期结果:

Android 串口调试_串口转usb需要驱动吗

3.写app测试发送串口ttyHSL1发送数据

本来以为android里面要加so或者jni, 没想到别人已经弄好了,直接implement就行了。。。

github:

           GitHub – AIlll/AndroidSerialPort: Android Serial Port , 基本的Android 串口通信库

就很简单了:

1. implementation ‘com.aill:AndroidSerialPort:1.0.8’

2.

package com.chao.serialconmunication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.aill.androidserialport.SerialPort;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button bt_write;
    private EditText et_msg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intiUi();
    }

    private void dataProcess(String str)
    {
        try {
            SerialPort serialPort = new SerialPort(new File("/dev/ttyHSL1"), 9600, 0);
            OutputStream outputStream = serialPort.getOutputStream();
            byte[] data = str.getBytes();
            outputStream.write(data);
            outputStream.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void intiUi()
    {
        bt_write = findViewById(R.id.bt_write);
        et_msg = findViewById(R.id.et_msg_send);
        bt_write.setOnClickListener(this);
    }


    @Override
    public void onClick(View view)
    {
        String str = et_msg.getText().toString();
        str = str + "\r\n";
        if(!str.isEmpty())
            dataProcess(str);
    }
}

3.可能报SecureException,  看下/dev/ttyHSL1的权限,chmod 777 /dev/ttyHSL1

4.预期效果

Android 串口调试_串口转usb需要驱动吗

 ———end——-

随便说说,网上那种动不动需要su的,挺SB的,根本不管原因,

Android 串口调试_串口转usb需要驱动吗

这种权限是可以系统里添加的,也不是每个机器的系统APP都能轻易获得su权限。 

 

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183424.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm gitee_pycharm上传代码到github

    pycharm gitee_pycharm上传代码到github1.查看git日志2.文件更改添加一部分信息后文件会变蓝新创建一个文件夹会提问要不要加入到Git中如果选择cancel文件夹会继续是红色的然后不加到Git仓库选择add则文件名变绿3.提交更改左键双击可以查看更改的具体信息填写提交的备注信息然后点击commit可以看到文件颜色消失下面是未push时的截图然后输入账号密码可以看到提交成功…

  • python里字符串转数字_c 字符串转数字

    python里字符串转数字_c 字符串转数字python数字转字符串的实现方法:1、使用格式化字符串,语句如“tt=322tem=’%d’%tt”;2、通过“str(5)”方法实现转换。推荐:《python教程》数字转成字符串方法一:使用格式化字符串:tt=322tem=’%d’%tttem即为tt转换成的字符串常用的格式化字符串:%d整数%f%F浮点数%e%E科学计数%g%Ge和%f/%E和%F的简写%%输出%格式化…

    2022年10月12日
  • 安全帽子识别

    安全帽子识别https://www.jianshu.com/p/55bd49c22cf4

  • 固态硬盘损坏 数据恢复_固态硬盘如何恢复数据

    固态硬盘损坏 数据恢复_固态硬盘如何恢复数据先在没有专业技术和维修经验的前提下,切勿自己动手去修复硬盘,操作不当极易对硬盘固件造成二次损坏,带来数据丢失的严重后果!有送修硬盘的客户,由于在小电脑店或者小作坊修过硬盘,失败后才拿到正规渠道做数据恢复,结果还是失败,正是因为一些不正确的操作对受损硬盘进行了二次或者多次损坏,导致数据恢复提取失败!所以,遇到硬盘故障问题,一定要送修专业机构进行数据恢复。专业级我们把常见的固态硬盘损坏概括为硬件损坏(电路板和主控)和固件损坏。1.硬件损坏如果是硬件损坏,可以通过更换电路板和主控来恢复硬盘

  • 数据中心部署模式二元化

    数据中心部署模式二元化

  • SSRF漏洞原理解析[通俗易懂]

    SSRF漏洞原理解析[通俗易懂]文章目录0x01基础知识1、SSRF漏洞简介:2、主要攻击方式:3、漏洞形成原理:4、漏洞的危害:0x02漏洞检测1、漏洞验证:2、漏洞的可能出现点:0x03绕过方法:1、绕过限制为某种域名:2、绕过限制请求IP不为内网地址:3、限制请求只为http协议:0x04漏洞利用1、产生漏洞的函数:2、漏洞靶场:0x05如何防御SSRF0x01基础知识1、SSRF漏洞简介:SSRF全称:Server-SideRequestForgery,即服务器端请求伪造,是一个由攻击者构造请求在目标服务

发表回复

您的电子邮箱地址不会被公开。

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