Доброго времени суток! Собственно вопрос потому как надо быстро наладить а в СИ пока не с руки - как в питоне передать ардуине по последовательному порту байты... именно байты а не символы... ну и массив тоже. Надо формировать пакеты для ModbusRTU, передавать и получать ответ в той же форме. На Си это нормально, но сейчас идёт отладка ардуины... и требуется "по быстрому" формировать запросы для него из малины... ну и получать ответы соответственно. С символами вопросов нет. Вообще питон применяю исключительно только для "попробовать", "испытать" и.... что бы быстро и под рукой - потому и знаний о нём довольно мало. Спасибо!
Что-то искал... искал... и попались только символьные параметры - это же извращение. Вот кое-что испытал: Код (Python): #!/usr/bin/python # coding: utf-8 import os import time import serial print("------TEST SERIAL-------") ser = serial.Serial( '/dev/ttyUSB0', 9600, timeout=10 ) ser.write('0') a = 100 while a > 0: db = 0x31 s = ser.readline() print(len(s)) print(s) ser.write('\x31') time.sleep(0.1) a = a - 1 # ser.write('\x30') time.sleep(1) ser.close(); В этом случае ser.write('\x31') посылаю шестнадцатеричное значение 0x31, что сооветствует клавише "1" - но это точно паранойя! Может кто ткнёт носом в документацию... потому как help в python ничего кроме настроек для порта не дал.
В питоне... что-то ничего не вышло... Ухожу на Си (тупой тест): Код (C++): #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main(int argc, char* argv[]) { struct termios serial; char* str = "135135135135135135"; char buffer[10]; if (argc == 1) { printf("Usage: %s [device]\n\n", argv[0]); return -1; } printf("Opening %s\n", argv[1]); int fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror(argv[1]); return -1; } if (tcgetattr(fd, &serial) < 0) { perror("Getting configuration"); return -1; } // Set up Serial Configuration serial.c_iflag = 0; serial.c_oflag = 0; serial.c_lflag = 0; serial.c_cflag = 0; serial.c_cc[VMIN] = 0; serial.c_cc[VTIME] = 0; serial.c_cflag = B9600| CS8 | CREAD; tcsetattr(fd, TCSANOW, &serial); // Apply configuration // Attempt to send and receive printf("Sending: %s\n", str); int wcount = write(fd, str, strlen(str)); if (wcount < 0) { perror("Write"); return -1; } else { printf("Send %d characters\n", wcount); } int rcount = read(fd, buffer, sizeof(buffer)); if (rcount < 0) { perror("Read"); return -1; } else { printf("Received %d characters\n", rcount); } buffer[rcount] = '\0'; printf("Received: %s\n", buffer); close(fd); } В данном случае пакет передаваемый ардуине: char* str = "135135135135135135"; Конечно это проба и... просто строка а не блок Modbus RTU и в ардуине не готово пока процедура работы с протоколами. Хотя байты 0x31 0x33 0x35 соответственно с каждым байтом увеличивается скорость моторчиков и изменяется положение камеры по горизонтали и вертикали. Скорость реакции устраивает со стороны Arduino по I2C с ComMotion shield for 4 motors и Multiservo. Простите ! Тема закрыта и никому не нужна. Понимаю, что многие в основном работают с символами и строками. Да и питон под это похоже заточен. У меня не вышло. Спасибо!