serial read portable para mac how due donate descargar serial-port arduino sdi sdi-12

serial port - read - Serie de Arduino: 7E1 invertido ¿Posible?



how to read serial port arduino (2)

Intento hablar en serie con un dispositivo SDI-12 y requiere siete bits de datos invertidos , incluso paridad y un bit de parada (7E1) en serie a 1200 baudios.

De la hoja de datos:

SDI-12 comunicación SDI-12 envía caracteres a 1200 bits por segundo. Cada carácter tiene 1 bit de inicio, 7 bits de datos (LSB primero), 1 bit de paridad par y 1 bit de parada (niveles lógicos activos bajos o invertidos):

All SDI-12 comandos y respuestas de All SDI-12 deben cumplir con el siguiente formato en la línea de datos. Tanto el comando como la respuesta van precedidos de una dirección y terminados por una combinación de alimentación de línea de retorno de carro.

¿Es esto posible con las bibliotecas Serial o SoftwareSerial? Estoy tratando de evitar el hardware adicional (más allá de un cambio de nivel a 3.3 V), pero lo haré si es la única manera.

He visto que SoftwareSerial puede invertirse y Serial puede hacer 7E1, pero no puedo encontrar si ambos pueden hacer ambas cosas.

Tengo acceso a Arduino Mega (R2) y Arduino Uno (R3).

Aquí está el dispositivo con el que quiero comunicarme: http://www.decagon.com/products/sensors/soil-moisture-sensors/gs3-soil-moisture-temperature-and-ec/ y aquí, http: // www .decagon.com / assets / Uploads / GS3-Integrators-Guide.pdf es el documento que explica el protocolo. Página 6 habla sobre su implementación de SDI.


No estoy familiarizado con Arduino, sin embargo, la capa física SDI-12 está invertida desde los niveles estándar de TTL, probablemente por dos motivos:

  1. Como la tensión de ralentí es de 0V, esto da como resultado una menor potencia de espera (debido a las resistencias nominales desplegables en un sensor típico SDI-12).
  2. Facilita el simple ''olfateo'' del bus utilizando un puerto serial RS-232 estándar.

Corto de golpeteo de un pin IO de 5V - sí, si se utiliza un UART microcontrolador estándar necesitará un inversor externo (o 2) y un buffer de 3 estados. Posiblemente requiera cambio de nivel, dependiendo de su hardware.

Pulgares hacia abajo a la entrada de Wikipedia - SDI-12 utiliza tiempos de bits UART completamente estándar (muy parecido a RS-232), solo diferentes niveles de señal (0 - 5V); ver el punto # 2. Sin embargo, existen secuencias de corte específicas y estrictos requisitos de temporización, lo que dificulta el desarrollo de firmware.

Si es serio sobre el desarrollo de firmware SDI-12, es posible que desee invertir en un verificador SDI-12 . Un estudio completo de la especificación es esencial.


Un poco tarde ... pero mejor tarde que nunca

De hecho, acabo de escribir una biblioteca para eso (en realidad, eso incluye los sensores ... por lo que debería funcionar exactamente con los ejemplos incluidos)

https://github.com/joranbeasley/SDISerial (Biblioteca Arduino)

#include <SDISerial.h> //https://github.com/joranbeasley/SDISerial (Arduino Library) #include <string.h> #define DATA_PIN 2 SDISerial connection(DATA_PIN); char output_buffer[125]; // just for uart prints char tmp_buffer[4]; char sensor_info[] //initialize variables void setup(){ connection.begin(); Serial.begin(9600);//so we can print to standard uart //small delay to let the sensor do its startup stuff delay(3000);//3 seconds should be more than enough char* sensor_info = connection.sdi_query("0I!",1000); // get sensor info for address 0 } //main loop void loop(){ //print to uart Serial.println("Begin Command: ?M!"); //send measurement query (M) to the first device on our bus char* resp = connection.service_request("0M!","0D0!");//Get Measurement from address 0 sprintf(output_buffer,"RECV: %s",resp?resp:"No Response Recieved!!"); Serial.println(output_buffer); delay(10000);//sleep for 10 seconds before the next read }