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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 武侠金曲「建议收藏」

    十首香港武侠金曲唱出无限中国意境

    2022年4月13日
    40
  • 【教程】Spring+Mybatis环境配置多数据源

    一、简要概述在做项目的时候遇到需要从两个数据源获取数据,项目使用的Spring + Mybatis环境,看到网上有一些关于多数据源的配置,自己也整理学习一下,然后自动切换实现从不同的数据源获取数据功能。二、代码详解2.1 DataSourceConstants 数据源常量类/** * 数据源名称常量类 * 对应 application.xml 中 bean multipleDataSo…

    2022年2月27日
    31
  • C语言strstr函数_strstr函数c语言实现

    C语言strstr函数_strstr函数c语言实现C语言strstr函数查找字符串的函数,语法规则char*strstr(constchar*string,constchar*strCharSet)用于查找字符串strCharSet是否为字符串string的子字符串,需要引用头文件#include<string.h>使用方法如下:intmain(){ chararr1[]=”Thisisanexercise”; chararr2[]=”anexercise”; char*ret1

    2022年10月15日
    3
  • 市场调研很难做?这些软件帮你理清思绪「建议收藏」

    市场调研很难做?这些软件帮你理清思绪「建议收藏」市场营销在进行市场调研,收集用户需求数据,追踪各市场策略的落实情况等日常工作时,需要使用各种图文工具帮助提高办公效率,推荐8个能够提高效率的神器。亿图脑图(MindMaster):专业思维导图绘制神器亿图脑图是一款国产专业思维导图绘制软件,素材丰富、模板多样,操作简单,易于上手,上千种素材和导图模板支持任意搭配,导图社区收纳各界大佬的思维导图支持编辑下载。5118:热点词汇挖掘神器市场达人可以通过5118官网,查询各个行业词库,了解行业热点,挖掘商机。石墨文档:实时协作办

    2025年6月5日
    2
  • 多线程CreateThread函数的用法

    多线程CreateThread函数的用法CreateThread当使用CreateProcess调用时,系统将创建一个进程和一个主线程。CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:1在内核对象中分配一个线程标

    2022年7月4日
    33
  • NB-IoT应用场景_iot框架

    NB-IoT应用场景_iot框架NB-IOT实现万物互联设计思路分享(固定上报类)NB-IOT窄带物联网(NarrowBandInternetofThings,NB-IoT),是一种专为万物互联打造的蜂窝网络连接技术。NB-IOT作为近年大火的一项物联网技术,因为其特性受到了众多行业众多企业的青睐。其广覆盖,大连接,低功耗,低成本的四大主要特点符合众多行业的实现物联网平滑过度的要求,成为了物联网技术又一代宠儿。本人也…

    2022年9月26日
    3

发表回复

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

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