如何在android kivy项目Python中使用usbserial4a接收uart消息

如何解决如何在android kivy项目Python中使用usbserial4a接收uart消息

我是一名本科生,这是我关于堆栈溢出的第一个问题。

我正在尝试通过 UART 使用安卓手机与 CoraZ7 板通信。我遵循了 jacklinquan (https://github.com/jacklinquan/usbserial4a) 的 usbserial4a 项目中的步骤。我能够连接到 FTDI 设备(出现“允许应用访问 USB 设备”),但应用似乎无法通过 UART 接收或发送消息。

我正在使用 https://github.com/jacklinquan/usbserial4a/blob/master/example/usbserial4a_ui_example.py 中给出的示例脚本。

我的设置:

  • 手机:搭载 Android 8.0.0 的 Galaxy A5
  • 设备:带有 FTDI FT2232HQ 的 CoraZ7

CoraZ7 每秒发送字符串“从主任务每 1 秒定期输出\r\n”。我用安卓上的“串行 USB 终端”应用验证了这一点。

在示例应用中,设备显示为“/dev/bus/usb/001/002”。当我连接时,它没有收到任何消息。当我使用写入按钮时,CoraZ7 rx LED 不亮。同时,在 pc (linux) 上,设备显示为“/dev/ttyUSB1”并且通信正常(它使用 pySerial 而不是 usbserial4a)。

以下是我用 buildozer 编译的 kivy android 项目的文件:

“projectFolder”/buildozer.spec


    [app]
    
    # (str) Title of your application
    title = My Application
    
    # (str) Package name
    package.name = myapp
    
    # (str) Package domain (needed for android/ios packaging)
    package.domain = org.test
    
    # (str) Source code where the main.py live
    source.dir = .
    
    # (list) Source files to include (let empty to include all the files)
    source.include_exts = py,png,jpg,kv,atlas
    
    # (list) List of inclusions using pattern matching
    #source.include_patterns = assets/*,images/*.png
    
    # (list) Source files to exclude (let empty to not exclude anything)
    #source.exclude_exts = spec
    
    # (list) List of directory to exclude (let empty to not exclude anything)
    #source.exclude_dirs = tests,bin,venv
    
    # (list) List of exclusions using pattern matching
    #source.exclude_patterns = license,images/*/*.jpg
    
    # (str) Application versioning (method 1)
    version = 0.1
    
    # (str) Application versioning (method 2)
    # version.regex = __version__ = ['"](.*)['"]
    # version.filename = %(source.dir)s/main.py
    
    # (list) Application requirements
    # comma separated e.g. requirements = sqlite3,kivy
    requirements = python3,kivy,usbserial4a,pyjnius,usb4a
    
    # (str) Custom source folders for requirements
    # Sets custom source for any requirements with recipes
    # requirements.source.kivy = ../../kivy
    
    # (str) Presplash of the application
    #presplash.filename = %(source.dir)s/data/presplash.png
    
    # (str) Icon of the application
    #icon.filename = %(source.dir)s/data/icon.png
    
    # (str) Supported orientation (one of landscape,sensorLandscape,portrait or all)
    orientation = portrait
    
    # (list) List of service to declare
    #services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY
    
    #
    # OSX Specific
    #
    
    #
    # author = © Copyright Info
    
    # change the major version of python used by the app
    osx.python_version = 3
    
    # Kivy version to use
    osx.kivy_version = 1.9.1
    
    #
    # Android specific
    #
    
    # (bool) Indicate if the application should be fullscreen or not
    fullscreen = 0
    
    # (string) Presplash background color (for android toolchain)
    # Supported formats are: #RRGGBB #AARRGGBB or one of the following names:
    # red,blue,green,black,white,gray,cyan,magenta,yellow,lightgray,# darkgray,grey,lightgrey,darkgrey,aqua,fuchsia,lime,maroon,navy,# olive,purple,silver,teal.
    #android.presplash_color = #FFFFFF
    
    # (string) Presplash animation using Lottie format.
    # see https://lottiefiles.com/ for examples and https://airbnb.design/lottie/
    # for general documentation.
    # Lottie files can be created using various tools,like Adobe After Effect or Synfig.
    #android.presplash_lottie = "path/to/lottie/file.json"
    
    # (list) Permissions
    #android.permissions = INTERNET
    
    # (list) features (adds uses-feature -tags to manifest)
    #android.features = android.hardware.usb.host
    
    # (int) Target Android API,should be as high as possible.
    #android.api = 27
    
    # (int) Minimum API your APK will support.
    #android.minapi = 21
    
    # (int) Android SDK version to use
    #android.sdk = 20
    
    # (str) Android NDK version to use
    #android.ndk = 19b
    
    # (int) Android NDK API to use. This is the minimum API your app will support,it should usually match android.minapi.
    #android.ndk_api = 21
    
    # (bool) Use --private data storage (True) or --dir public storage (False)
    #android.private_storage = True
    
    # (str) Android NDK directory (if empty,it will be automatically downloaded.)
    #android.ndk_path =
    
    # (str) Android SDK directory (if empty,it will be automatically downloaded.)
    #android.sdk_path =
    
    # (str) ANT directory (if empty,it will be automatically downloaded.)
    #android.ant_path =
    
    # (bool) If True,then skip trying to update the Android sdk
    # This can be useful to avoid excess Internet downloads or save time
    # when an update is due and you just want to test/build your package
    # android.skip_update = False
    
    # (bool) If True,then automatically accept SDK license
    # agreements. This is intended for automation only. If set to False,# the default,you will be shown the license when first running
    # buildozer.
    # android.accept_sdk_license = False
    
    # (str) Android entry point,default is ok for Kivy-based app
    #android.entrypoint = org.renpy.android.PythonActivity
    
    # (str) Android app theme,default is ok for Kivy-based app
    # android.apptheme = "@android:style/Theme.NoTitleBar"
    
    # (list) Pattern to whitelist for the whole project
    #android.whitelist =
    
    # (str) Path to a custom whitelist file
    #android.whitelist_src =
    
    # (str) Path to a custom blacklist file
    #android.blacklist_src =
    
    # (list) List of Java .jar files to add to the libs so that pyjnius can access
    # their classes. Don't add jars that you do not need,since extra jars can slow
    # down the build process. Allows wildcards matching,for example:
    # OUYA-ODK/libs/*.jar
    #android.add_jars = foo.jar,bar.jar,path/to/more/*.jar
    
    # (list) List of Java files to add to the android project (can be java or a
    # directory containing the files)
    #android.add_src =
    
    # (list) Android AAR archives to add
    #android.add_aars =
    
    # (list) Gradle dependencies to add
    #android.gradle_dependencies =
    
    # (list) add java compile options
    # this can for example be necessary when importing certain java libraries using the 'android.gradle_dependencies' option
    # see https://developer.android.com/studio/write/java8-support for further information
    # android.add_compile_options = "sourceCompatibility = 1.8","targetCompatibility = 1.8"
    
    # (list) Gradle repositories to add {can be necessary for some android.gradle_dependencies}
    # please enclose in double quotes 
    # e.g. android.gradle_repositories = "maven { url 'https://kotlin.bintray.com/ktor' }"
    #android.add_gradle_repositories =
    
    # (list) packaging options to add 
    # see https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
    # can be necessary to solve conflicts in gradle_dependencies
    # please enclose in double quotes 
    # e.g. android.add_packaging_options = "exclude 'META-INF/common.kotlin_module'","exclude 'META-INF/*.kotlin_module'"
    #android.add_packaging_options =
    
    # (list) Java classes to add as activities to the manifest.
    #android.add_activities = com.example.ExampleActivity
    
    # (str) OUYA Console category. Should be one of GAME or APP
    # If you leave this blank,OUYA support will not be enabled
    #android.ouya.category = GAME
    
    # (str) Filename of OUYA Console icon. It must be a 732x412 png image.
    #android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png
    
    # (str) XML file to include as an intent filters in <activity> tag
    #android.manifest.intent_filters = intent-filter.xml
    
    # (str) launchMode to set for the main activity
    #android.manifest.launch_mode = standard
    
    # (list) Android additional libraries to copy into libs/armeabi
    #android.add_libs_armeabi = libs/android/*.so
    #android.add_libs_armeabi_v7a = libs/android-v7/*.so
    #android.add_libs_arm64_v8a = libs/android-v8/*.so
    #android.add_libs_x86 = libs/android-x86/*.so
    #android.add_libs_mips = libs/android-mips/*.so
    
    # (bool) Indicate whether the screen should stay on
    # Don't forget to add the WAKE_LOCK permission if you set this to True
    #android.wakelock = False
    
    # (list) Android application meta-data to set (key=value format)
    #android.meta_data =
    
    # (list) Android library project to add (will be added in the
    # project.properties automatically.)
    #android.library_references =
    
    # (list) Android shared libraries which will be added to AndroidManifest.xml using <uses-library> tag
    #android.uses_library =
    
    # (str) Android logcat filters to use
    #android.logcat_filters = *:S python:D
    
    # (str) Android additional adb arguments
    #android.adb_args = -H host.docker.internal
    
    # (bool) Copy library instead of making a libpymodules.so
    #android.copy_libs = 1
    
    # (str) The Android arch to build for,choices: armeabi-v7a,arm64-v8a,x86,x86_64
    android.arch = armeabi-v7a
    
    # (int) overrides automatic versionCode computation (used in build.gradle)
    # this is not the same as app version and should only be edited if you know what you're doing
    # android.numeric_version = 1
    
    # (bool) enables Android auto backup feature (Android API >=23)
    android.allow_backup = True
    
    # (str) XML file for custom backup rules (see official auto backup documentation)
    # android.backup_rules =
    
    # (str) If you need to insert variables into your AndroidManifest.xml file,# you can do so with the manifestPlaceholders property.
    # This property takes a map of key-value pairs. (via a string)
    # Usage example : android.manifest_placeholders = [myCustomUrl:\"org.kivy.customurl\"]
    # android.manifest_placeholders = [:]
    
    #
    # Python for android (p4a) specific
    #
    
    # (str) python-for-android fork to use,defaults to upstream (kivy)
    #p4a.fork = kivy
    
    # (str) python-for-android branch to use,defaults to master
    #p4a.branch = master
    
    # (str) python-for-android git clone directory (if empty,it will be automatically cloned from github)
    #p4a.source_dir =
    
    # (str) The directory in which python-for-android should look for your own build recipes (if any)
    #p4a.local_recipes =
    
    # (str) Filename to the hook for p4a
    #p4a.hook =
    
    # (str) Bootstrap to use for android builds
    # p4a.bootstrap = sdl2
    
    # (int) port number to specify an explicit --port= p4a argument (eg for bootstrap flask)
    #p4a.port =
    
    # Control passing the --use-setup-py vs --ignore-setup-py to p4a
    # "in the future" --use-setup-py is going to be the default behaviour in p4a,right now it is not
    # Setting this to false will pass --ignore-setup-py,true will pass --use-setup-py
    # NOTE: this is general setuptools integration,having pyproject.toml is enough,no need to generate
    # setup.py if you're using Poetry,but you need to add "toml" to source.include_exts.
    #p4a.setup_py = false
    
    
    #
    # iOS specific
    #
    
    # (str) Path to a custom kivy-ios folder
    #ios.kivy_ios_dir = ../kivy-ios
    # Alternately,specify the URL and branch of a git checkout:
    ios.kivy_ios_url = https://github.com/kivy/kivy-ios
    ios.kivy_ios_branch = master
    
    # Another platform dependency: ios-deploy
    # Uncomment to use a custom checkout
    #ios.ios_deploy_dir = ../ios_deploy
    # Or specify URL and branch
    ios.ios_deploy_url = https://github.com/phonegap/ios-deploy
    ios.ios_deploy_branch = 1.10.0
    
    # (bool) Whether or not to sign the code
    ios.codesign.allowed = false
    
    # (str) Name of the certificate to use for signing the debug version
    # Get a list of available identities: buildozer ios list_identities
    #ios.codesign.debug = "iPhone Developer: <lastname> <firstname> (<hexstring>)"
    
    # (str) Name of the certificate to use for signing the release version
    #ios.codesign.release = %(ios.codesign.debug)s
    
    
    [buildozer]
    
    # (int) Log level (0 = error only,1 = info,2 = debug (with command output))
    log_level = 2
    
    # (int) Display warning if buildozer is run as root (0 = False,1 = True)
    warn_on_root = 1
    
    # (str) Path to build artifact storage,absolute or relative to spec file
    # build_dir = ./.buildozer
    
    # (str) Path to build output (i.e. .apk,.ipa) storage
    # bin_dir = ./bin
    
    #    -----------------------------------------------------------------------------
    #    List as sections
    #
    #    You can define all the "list" as [section:key].
    #    Each line will be considered as a option to the list.
    #    Let's take [app] / source.exclude_patterns.
    #    Instead of doing:
    #
    #[app]
    #source.exclude_patterns = license,data/audio/*.wav,data/images/original/*
    #
    #    This can be translated into:
    #
    #[app:source.exclude_patterns]
    #license
    #data/audio/*.wav
    #data/images/original/*
    #
    
    
    #    -----------------------------------------------------------------------------
    #    Profiles
    #
    #    You can extend section / key with a profile
    #    For example,you want to deploy a demo version of your application without
    #    HD content. You could first change the title to add "(demo)" in the name
    #    and extend the excluded directories to remove the HD content.
    #
    #[app@demo]
    #title = My Application (demo)
    #
    #[app:source.exclude_patterns@demo]
    #images/hd/*
    #
    #    Then,invoke the command line with the "demo" profile:
    #
    #buildozer --profile demo android debug
    
    # (list) python-for-android whitelist
    android.p4a_whitelist = lib-dynload/termios.so

“projectFolder”/intent-filter.xml

    <intent-filter>
       <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    </intent-filter>
    
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
        android:resource="@xml/device_filter" />

“projectFolder”/.buildozer/android/platform/build-armeabi-v7a/dists/myapp_armeabi-v7a/src/main/res/xml/device_filter.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
        <!-- <usb-device vendor-id="YOUR VID" product-id="YOUR PID" />  -->
        <usb-device />
    </resources>

"projectFolder"/.buildozer/android/platform/build-armeabi-v7a/dists/myapp_armeabi-v7a/templates/AndroidManifest.tmpl.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Replace org.libsdl.app with the identifier of your game below,e.g.
         com.gamemaker.game
    -->
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="{{ args.package }}"
          android:versionCode="{{ args.numeric_version }}"
          android:versionName="{{ args.version }}"
          android:installLocation="auto">
    
        <supports-screens
                android:smallScreens="true"
                android:normalScreens="true"
                android:largeScreens="true"
                android:anyDensity="true"
                {% if args.min_sdk_version >= 9 %}
                android:xlargeScreens="true"
                {% endif %}
        />
    
        <!-- Android 2.3.3 -->
        <uses-sdk android:minSdkVersion="{{ args.min_sdk_version }}" android:targetSdkVersion="{{ android_api }}" />
    
        <!-- OpenGL ES 2.0 -->
        <uses-feature android:glEsVersion="0x00020000" />
    
        <!-- USB OTG -->
        <uses-feature android:name="android.hardware.usb.host" />
    
        <!-- Allow writing to external storage -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        {% for perm in args.permissions %}
        {% if '.' in perm %}
        <uses-permission android:name="{{ perm }}" />
        {% else %}
        <uses-permission android:name="android.permission.{{ perm }}" />
        {% endif %}
        {% endfor %}
    
        {% if args.wakelock %}
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        {% endif %}
    
        {% if args.billing_pubkey %}
        <uses-permission android:name="com.android.vending.BILLING" />
        {% endif %}
    
        {{ args.extra_manifest_xml }}
    
    
        <!-- Create a Java class extending SDLActivity and place it in a
             directory under src matching the package,e.g.
                src/com/gamemaker/game/MyGame.java
    
             then replace "SDLActivity" with the name of your class (e.g. "MyGame")
             in the XML below.
    
             An example Java class can be found in README-android.txt
        -->
        <application android:label="@string/app_name"
                     {% if debug %}android:debuggable="true"{% endif %}
                     android:icon="@drawable/icon"
                     android:allowBackup="{{ args.allow_backup }}"
                     android:theme="{{args.android_apptheme}}{% if not args.window %}.Fullscreen{% endif %}"
                     android:hardwareAccelerated="true" >
            {% for l in args.android_used_libs %}
            <uses-library android:name="{{ l }}" />
            {% endfor %}
    
            {% for m in args.meta_data %}
            <meta-data android:name="{{ m.split('=',1)[0] }}" android:value="{{ m.split('=',1)[-1] }}"/>{% endfor %}
            <meta-data android:name="wakelock" android:value="{% if args.wakelock %}1{% else %}0{% endif %}"/>
    
            <activity android:name="{{args.android_entrypoint}}"
                      android:label="@string/app_name"
                      android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|fontScale|uiMode{% if args.min_sdk_version >= 8 %}|uiMode{% endif %}{% if args.min_sdk_version >= 13 %}|screenSize|smallestScreenSize{% endif %}{% if args.min_sdk_version >= 17 %}|layoutDirection{% endif %}{% if args.min_sdk_version >= 24 %}|density{% endif %}"
                      android:screenOrientation="{{ args.orientation }}"
                      {% if args.activity_launch_mode %}
                      android:launchMode="{{ args.activity_launch_mode }}"
                      {% endif %}
                      >
    
                {% if args.launcher %}
                <intent-filter>
                    <action android:name="org.kivy.LAUNCH" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:scheme="{{ url_scheme }}" />
                </intent-filter>
                {% else  %}
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
                {% endif %}
    
                {%- if args.intent_filters -%}
                {{- args.intent_filters -}}
                {%- endif -%}
            </activity>
    
            {% if args.launcher %}
            <activity android:name="org.kivy.android.launcher.ProjectChooser"
                      android:icon="@drawable/icon"
                      android:label="@string/app_name">
    
              <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
    
            </activity>
            {% endif %}
    
            {% if service or args.launcher %}
            <service android:name="org.kivy.android.PythonService"
                     android:process=":pythonservice" />
            {% endif %}
            {% for name in service_names %}
            <service android:name="{{ args.package }}.Service{{ name|capitalize }}"
                     android:process=":service_{{ name }}" />
            {% endfor %}
            {% for name in native_services %}
            <service android:name="{{ name }}" />
            {% endfor %}
    
            {% if args.billing_pubkey %}
            <service android:name="org.kivy.android.billing.BillingReceiver"
                     android:process=":pythonbilling" />
            <receiver android:name="org.kivy.android.billing.BillingReceiver"
                      android:process=":pythonbillingreceiver">
                <intent-filter>
                    <action android:name="com.android.vending.billing.IN_APP_NOTIFY" />
                    <action android:name="com.android.vending.billing.RESPONSE_CODE" />
                    <action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" />
                </intent-filter>
            </receiver>
            {% endif %}
        {% for a in args.add_activity  %}
        <activity android:name="{{ a }}"></activity>
        {% endfor %}
        </application>
    
    </manifest>

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

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-