Embedded 将Python程序转换为Arduino草图

Embedded 将Python程序转换为Arduino草图,embedded,Embedded,这就是我目前使用Python从仪表读取数据的方法 导入序列号 导入时间 SNRM=“7EA00703619369477E” ser=serial.serial('/dev/ttyUSB0') ser.write(bytes.fromhex(SNRM)) 时间。睡眠(1) data=ser.read_all().hex() 打印(数据) 我想在ArduinoIDE中编写相同的程序(用于Arduino Uno)。请帮助我,我是编程新手。不清楚如何在Aduino Unu上实现这一点,因为它只支持一个

这就是我目前使用Python从仪表读取数据的方法

导入序列号
导入时间
SNRM=“7EA00703619369477E”
ser=serial.serial('/dev/ttyUSB0')
ser.write(bytes.fromhex(SNRM))
时间。睡眠(1)
data=ser.read_all().hex()
打印(数据)

我想在ArduinoIDE中编写相同的程序(用于Arduino Uno)。请帮助我,我是编程新手。

不清楚如何在Aduino Unu上实现这一点,因为它只支持一个串行端口(串行端口暴露在I/O头上,并连接到USB到TTL串行转换器芯片。您需要一个连接到“仪表”,另一个连接到“打印”输出

此外,串行管脚是TTL电平而不是RS-232电平,您可能需要添加一个线路驱动器来连接串行端口到您的表。如果您不建立自己的,考虑一个。这将使硬件UART可用于“打印”输出和编程设备。 如果你想“打印”数据,你需要一个带有额外端口的Arduino。例如,一个Mega、Uno WiFi、Zero或Due(基于ARM的)。或者一个显示“屏蔽”([strong>编辑:或使用Ezra Bühler建议的对象)

假设您确实希望对数据执行某些操作,而不是“打印”数据,则以下内容将每秒执行一次读取(有许多其他解决方案),但会丢弃数据-您需要弄清楚如何处理数据:

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.setTimeout(1000) ;
}

void loop()
{
  static const uint8_t SNRM[] = { 0x7E, 0xA0, 0x07, 0x03, 0x61, 0x93, 0x69, 0x47, 0x7E } ;
  static uint8_t read_buffer[128] ;

  Serial.write( SNRM, sizeof(SNRM) ) ;
  size_t count = Serial.readBytes( read_buffer, sizeof(read_buffer) ) ;
  
  // Do something with the data here
  
}
以上假设9600,N,8,1个串行帧。根据需要进行更改。您还没有指定“米”输出或响应的长度。您必须允许足够的缓冲区长度-我允许128个字节,这可能足够-再次让您根据需要进行更改


<>但是,我建议您了解ARDUNO硬件和草图编程(本质上是C++框架,它在一个环境中隐藏了一些更复杂的细节)。(串行端口暴露在I/O头上,并连接到USB到TTL串行转换器芯片。您需要一个连接到“仪表”,另一个连接到“打印”输出

此外,串行管脚是TTL电平而不是RS-232电平,您可能需要添加一个线路驱动器来连接串行端口到您的表。如果您不建立自己的,考虑一个。这将使硬件UART可用于“打印”输出和编程设备。 如果你想“打印”数据,你需要一个带有额外端口的Arduino。例如,一个Mega、Uno WiFi、Zero或Due(基于ARM的)。或者一个显示“屏蔽”([strong>编辑:或使用Ezra Bühler建议的对象)

假设您确实希望对数据执行某些操作,而不是“打印”数据,则以下内容将每秒执行一次读取(有许多其他解决方案),但会丢弃数据-您需要弄清楚如何处理数据:

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.setTimeout(1000) ;
}

void loop()
{
  static const uint8_t SNRM[] = { 0x7E, 0xA0, 0x07, 0x03, 0x61, 0x93, 0x69, 0x47, 0x7E } ;
  static uint8_t read_buffer[128] ;

  Serial.write( SNRM, sizeof(SNRM) ) ;
  size_t count = Serial.readBytes( read_buffer, sizeof(read_buffer) ) ;
  
  // Do something with the data here
  
}
以上假设9600,N,8,1个串行帧。根据需要进行更改。您还没有指定“米”输出或响应的长度。您必须允许足够的缓冲区长度-我允许128个字节,这可能足够-再次让您根据需要进行更改


<>但是我建议您了解ARDUNO硬件和草图编程(本质上是一个C++框架,它在一个隐藏了一些更复杂细节的环境中)。

这里您的Python代码的一个尝试端口:

#包括
软件串行传感器端口(2,3);//接收,发送
无效设置(){
Serial.begin(9600);
Serial.println(“你好!”);
sensorPort.begin(9600);
}
void循环(){
字节snrm[]={0x7E,0xA0,0x07,0x03,0x61,0x93,0x69,0x47,0x7E};
sensorPort.write(snrm,sizeof(snrm));
延迟(1000);
字节数据[32]={0};
int bytesavable=sensorPort.available();
int bytesRead=sensorPort.readBytes(数据,字节可用);
串出{“0x”};
for(int i=0;i
这是未经测试的,可能需要更多的调整

由于Arduino Uno只有一个串行端口,通常用于向计算机发送调试跟踪,因此我使用了如上所述的软件串行端口


也许您还想看看IDE附带的示例,您可以在下面找到:File>examples

这里是Python代码的一个尝试端口:

#包括
软件串行传感器端口(2,3);//接收,发送
无效设置(){
Serial.begin(9600);
Serial.println(“你好!”);
sensorPort.begin(9600);
}
void循环(){
字节snrm[]={0x7E,0xA0,0x07,0x03,0x61,0x93,0x69,0x47,0x7E};
sensorPort.write(snrm,sizeof(snrm));
延迟(1000);
字节数据[32]={0};
int bytesavable=sensorPort.available();
int bytesRead=sensorPort.readBytes(数据,字节可用);
串出{“0x”};
for(int i=0;i
这是未经测试的,可能需要更多的调整

由于Arduino Uno只有一个串行端口,通常用于向计算机发送调试跟踪,因此我使用了如上所述的软件串行端口


也许您还想看看IDE附带的示例,您可以在下面找到:文件>示例

整洁-我不知道整洁-我以前不知道,我使用的是USB到RS-232转换器,它能够与仪表通信并返回数据。在我以前的设置中,USB-RS-232转换器连接到通过光缆连接仪表的光端口。所以,经过一些研究,我找到了这个接口,通过它我可以绕过USB-RS232转换器,直接连接光端口