在python 3中,我导入了pySerial库,因此我可以通过串行命令与我的arduino uno通信,它在python 2.7中工作得非常好但在python 3中我一直遇到错误,它说这个TypeError:不支持unicode字符串,请编码到bytes:'allon'在python 2.7中我唯一不同的是使用raw_input但是我不知道python 3中发生了什么这里是我的代码
import serial, time
import tkinter
import os
def serialcmdw():
os.system('clear')
serialcmd = input("serial command: ")
ser.write (serialcmd)
serialcmdw()
ser = serial.Serial()
os.system('clear')
ser.port = "/dev/cu.usbmodem4321"
ser.baudrate = 9600
ser.open()
time.sleep(1)
serialcmdw()
Run Code Online (Sandbox Code Playgroud) 我有一个Arduino连接到运行循环的计算机,每100毫秒通过串口发送一个值回计算机.
我想制作一个Python脚本,每隔几秒就会从串口读取一次,所以我希望它能看到从Arduino发送的最后一件事.
你是怎么做Pyserial的?
这是我尝试过的代码不起作用的代码.它按顺序读取行.
import serial
import time
ser = serial.Serial('com4',9600,timeout=1)
while 1:
time.sleep(10)
print ser.readline() #How do I get the most recent line sent from the device?
Run Code Online (Sandbox Code Playgroud) 我有一个Arduino,我想知道实际值到底是什么HIGH和LOW意味着......他们是签名的吗?无符号整数?无符号字符??? 他们的价值观是什么?我猜测HIGH和LOW可能是无符号整数,所有的位分别设置为1和0,但我不确定.我希望能够使用HIGH和LOW进行按位操作,或者将HIGH或LOW以外的值传递给digitalWrite.另外,我如何将整数转换为HIGH或LOW以便我可以这样做?
我有一个Arduino Uno和一个Linux环境.尽管Arduino IDE非常棒,但是如果出现问题,它并没有给我太多的帮助.它也变得极其缓慢并且有时会停止与芯片通信.
另一种方法是使用AVR-GCC/g ++和AVRDude工具链对我的Arduino Uno进行编码.但是,在使用简单的文本编辑器和命令行工具进行编程时,我非常希望能够访问与Arduino相同的功能(如Serial,digitalWrite等).
所以我试图找到头文件,其中定义了所有函数,即"Arduino.h" /usr/share/arduino/hardware/arduino/cores/arduino.
我用它来编译(使用makefile来做这个)
avr-gcc -mmcu=atmega328p -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=testarduino.o -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard -std=gnu99 -MMD -MP -MF .dep/testarduino.elf.d testarduino.o --output testarduino.elf -Wl,-Map=testarduino.map,--cref -lm
Run Code Online (Sandbox Code Playgroud)
编译这段代码:
#include "Arduino.h"
int main(void)
{
init();
pinMode(13,OUTPUT);
while(1){
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译时(似乎未定义引用'xxxxxxxxx')似乎没有识别出任何函数.那么需要包含哪些确切的头文件以确保我可以使用相同的功能?还是我错过了别的什么?
目前,在Python可以与设备通信之前,python程序必须知道设备(Arduino)所在的端口.
问题:每当设备插入并重新插入时,其COM端口都会发生变化,因此必须再次向Python提供正确的串行端口才能找到该设备.
Python(使用pySerial)如何自动搜索要使用的正确串口?python是否可以将串口上的设备正确识别为Arduino?
我正在尝试创建一个接受float变量并将其转换为字节数组的函数.我找到了一段有效的代码片段,但如果可能的话,我想在函数中重用它.
我也在使用Arduino环境,但我知道它接受大多数C语言.
目前有效:
float_variable = 1.11;
byte bytes_array[4];
*((float *)bytes_array) = float_variable;
Run Code Online (Sandbox Code Playgroud)
我可以在这里更改以使此功能有效吗?
float float_test = 1.11;
byte bytes[4];
// Calling the function
float2Bytes(&bytes,float_test);
// Function
void float2Bytes(byte* bytes_temp[4],float float_variable){
*(float*)bytes_temp = float_variable;
}
Run Code Online (Sandbox Code Playgroud)
我不太熟悉指针等,但我读过(浮动)是使用铸造还是什么?
任何帮助将不胜感激!
干杯
*编辑:已解决
这是我的最终功能在Arduino中适用于任何发现此功能的人.在下面的答案中有更有效的解决方案,但我认为这是可以理解的.
功能:将输入浮点变量转换为字节数组
void float2Bytes(float val,byte* bytes_array){
// Create union of shared memory space
union {
float float_variable;
byte temp_array[4];
} u;
// Overite bytes of union with float variable
u.float_variable = val;
// Assign bytes to input array
memcpy(bytes_array, u.temp_array, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的 arduino IDE 更新到更新版本,以便它可以在 IOS Catalina 上运行。我正在遵循一些有关如何使它们兼容的说明,但我陷入了这一步。我打算将此命令放入:
xattr -d com.apple.quarantine /usr/local/bin/avrdude
Run Code Online (Sandbox Code Playgroud)
但我不断收到此错误:
xattr: /usr/local/bin/avrdude: No such xattr: com.apple.quarantine
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么,因为当我输入以下命令时:
sudo mv avrdude /usr/local/bin
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
avrdude and /usr/local/bin/avrdude are identical
Run Code Online (Sandbox Code Playgroud)
这告诉我该文件位于正确的位置(我认为)。我在 .zshrc 中的路径当前设置为:
export PATH=/usr/local/bin:/usr/local/avr/bin:$PATH
Run Code Online (Sandbox Code Playgroud)
但是当我输入:
printenv PATH
Run Code Online (Sandbox Code Playgroud)
我得到的东西与上面列出的路径不同。我确信这是问题的一部分,但我不知道从哪里开始寻找。
我正在尝试编写一个Arduino库(实际上是一个C++类),它本身引用了我在Mac的〜/ Documents/Arduino/libraries目录中安装的另一个库.
在我正在写的图书馆的.cpp的顶部,我试过了
#include <ReferencedLibrary.h>
Run Code Online (Sandbox Code Playgroud)
和
#include "ReferencedLibrary.h"
Run Code Online (Sandbox Code Playgroud)
......两者都不起作用.我可以#include <ReferencedLibrary.h>在〜/ Documents/Arduino目录中成功绘制草图.我错过了什么或者这是Arduino IDE/makefile的限制吗?有解决方法吗?
我希望能够让我的iPhone-App通过蓝牙与我的Arduino通信.我发现了一些支持以下协议的蓝牙防护:BCSP,DUN,LAN,GAP SDP,RFCOMM和L2CAP.从我在google搜索时发现的是,iPhone是否正在隐藏它的蓝牙堆栈?!?它是否正确?是否真的没有机会让我的iPhone与其他支持蓝牙的设备进行通信而不进行越狱(据我所知,如果我使用btstack,则需要这个设备:http://code.google.com/p/btstack/) ?
如果蓝牙真的不可能,你会建议实现通信的其他方式(期望WLAN)?我想要实现的是这样的:http://theiopage.blogspot.com/2011/08/yanis-android-wireless-eos-controller.html
谢谢你的任何提示!
我几乎完成了我的开源DCF77解码器项目.当我注意到标准(Arduino)DCF77库在噪声信号上表现非常差时,一切都开始了.特别是当天线靠近电脑或我的洗衣机运行时,我从来没有能够从解码器中抽出时间.
我的第一种方法是为输入信号添加一个(数字)指数滤波器+触发器.
虽然这显着改善了情况,但仍然不是很好.然后我开始阅读一些关于数字信号处理的标准书籍,特别是Claude Elwood Shannon的原创作品.我的结论是,正确的方法是不对信号进行"解码",因为它是完全已知的先验(闰秒除外).相反,将接收的数据与本地合成的信号进行匹配并确定适当的相位会更合适.这反过来会将有效带宽减少一些数量级,从而显着降低噪声.
相位检测意味着需要快速卷积.有效卷积的标准方法当然是快速傅里叶变换.但是我正在为Arduino/Atmega 328实现.因此我只有2k RAM.因此,我开始堆叠匹配的锁相环滤波器,而不是使用FFT的直接方法.我在这里记录了不同的项目阶段:
我非常广泛地搜索了互联网,发现没有类似的方法.我仍然想知道是否有类似(也许更好)的实现.或者是否存在对这种信号重建的研究.
我不是在寻找:设计优化的代码以接近香农极限.我也没有在DCF77上搜索有关叠加PRNG代码的信息.我也不需要关于"匹配滤波器"的提示,因为我当前的实现是匹配滤波器的近似值.关于Viterbi Decoders或Trellis方法的具体提示不是我要寻找的 - 除非它们解决了严格的CPU和RAM限制问题.
我正在寻找的是:是否有任何其他非平凡算法的描述/实现,用于解码像DCF77这样的信号,在存在重大噪声的情况下CPU和RAM有限?也许在互联网时代以前的一些书籍或论文中?