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权限。 

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql 更改密码 alter_MySQL修改账号密码方法大全「建议收藏」

    mysql 更改密码 alter_MySQL修改账号密码方法大全「建议收藏」前言:在日常使用数据库的过程中,难免会遇到需要修改账号密码的情景,比如密码太简单需要修改、密码过期需要修改、忘记密码需要修改等。本篇文章将会介绍需要修改密码的场景及修改密码的几种方式。1.忘记root密码忘记root密码的场景还是比较常见的,特别是自己搭的测试环境经过好久没用过时,很容易记不得当时设置的密码。这个时候一般常用的方法是跳过权限验证,然后更改root密码,之后再启用权限验证…

    2022年8月12日
    42
  • PLsql 永久注册码「建议收藏」

    PLsql 永久注册码「建议收藏」 注册码:ProductCode:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserialNumber:601769password:xs374ca  原文链接:https://blog.csdn.net/sinat_33142609/article/details/72540025

    2022年7月24日
    554
  • 2015年最新Android基础入门教程目录(完结版)

    2015年最新Android基础入门教程目录(完结版)2015年最新Android基础入门教程目录(完结版)前言:关于《2015年最新Android基础入门教程目录》终于在今天落下了帷幕,全套教程共148节已编写完毕,附上目录,关于教程的由来,笔者的情况和自学心得,资源分享以及一些疑问等可戳:下面是本系列教程的完整目录:

    2022年5月2日
    34
  • javascript断点调试

    javascript断点调试一、方法11.断点文件位置打开chrome,找到Sources,在一堆的文件夹里面找到你要调试的js文件,打开它:下面是html前端展示:2.打断点当你运行代码的时候,例如:操作搜索按钮点击事件,出现未知问题。首先,给Sources里面的js文件打断点。点击你要调试的代码的行数,发现行数会被标记为蓝色(chrome),这说明已经成功打断点了,恭喜你成功了第一步。3.断点调试对断点进行调试,首

    2022年5月21日
    44
  • 关于balun的一些仿真和思考[通俗易懂]

    关于balun的一些仿真和思考[通俗易懂]关于balun的一些仿真和思考1、错误的初始设计,电路图如下:2、来看看ADS里,理想balun的仿真结果3、将原电路的50ohm并接在balun的差分端,而非单端,再看看仿真结果。4、那么为什么出现上述情况呢?5、我们应该如何去做呢?6、总结:如有错误,还请留言区指出~为了提高共模抑制能力,很多芯片的输入输出口会设计成差分口,在射频电路中也是如此。最近在项目测试中,一个关于balun的问题困扰了我很久,迟迟没有想明白。我爸说:“当一个问题你久久思考却毫无头绪时,你就暂时放一放。也许有天突然开窍,你就想

    2025年8月1日
    3
  • Raid0、 Raid1、 Raid5、 Raid10的原理、特点、性能区别[通俗易懂]

    Raid0、 Raid1、 Raid5、 Raid10的原理、特点、性能区别[通俗易懂]一、RAID是什么?RAID(RedundantArrayofIndependentDisks)即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。二、RAID有哪些?RAID方案常见的可以分为:RAID0 RAID1 RAID5 RAID6 RAID10下面来分别介绍一下。Raid0:至少需要两块硬盘,磁盘越多,读写速度越快,没有冗余。Raid1:只能用两块硬

    2022年7月25日
    21

发表回复

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

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