ASCII

Тема в разделе "Arduino & Shields", создана пользователем mike_KH, 8 янв 2016.

  1. mike_KH

    mike_KH Гик

    Прошу помогите, нигде не могут дать ответ. Вот код, я с питоном даже не лезу, отправляю 20160108183925 получаю -468303499, понимаю что кодировка ASKII, но все известные мне способы не помогают. Пожалуйста избавьте меня уже от этого мазохизма, третий день сижу, а сделал как кот наплакал.
    Код (C++):
    #include <SPI.h>
    #define cs   10
    #define dc   9
    #define rst  8

    TFT TFTscreen = TFT(cs, dc, rst);
    char DATETIME[26];

    void setup() {
      TFTscreen.begin();
      Serial.begin(9600);
    }

    void loop() {
      String ComData = String(Serial.parseInt());
      ComData.toCharArray(DATETIME, 26);
      if(Serial.available() > 0){
        Serial.print(DATETIME);
      }
     
      TFTscreen.background(0, 0, 0);
      TFTscreen.stroke(255, 255, 255);
      TFTscreen.setTextSize(2);
      TFTscreen.text(DATETIME, 0, 20);
    }
    Код на питоне
    Код (Python):
    import os
    import sys
    import serial
    import datetime
    ser = serial.Serial('COM4', 9600)
    print(ser.name)
    print(datetime.datetime.now())
    date_string = str(datetime.datetime.now())
    date_string = date_string[:4] + date_string[5:7] + date_string[8:10] + date_string[11:13] + date_string[14:16] + date_string[17:19]
    print(date_string)
    date_bytes = date_string.encode('ascii')
    ser.write(date_bytes)
    print('OK')
    print(date_bytes)
    print(len(date_bytes))
    ser.close
     
  2. mike_KH

    mike_KH Гик

    Я скоро с окна прыгну, 3 дня ничего кроме кодинга не делаю, с перерывами только на сон и еду
     
  3. mike_KH

    mike_KH Гик

  4. mike_KH

    mike_KH Гик

    Исправил код не много и при отправке загорается белый экран в чем проблема?
     
  5. Alex19

    Alex19 Гуру

    Вы отправляете.
    Вы принимаете
    Код (C++):
    String ComData = String(Serial.parseInt());
    Вас не смущает, что то, что Вы отправляете не поместится в int?

    Вот код, который работает и принимает данную строку.
    Код (C++):
    // Константа хранящая мак. размер массива хранящего пакет данных
    #define receiveSizeArrayCOM 26

    // Массив хранящий полученый пакет данных.
    char DATETIME[receiveSizeArrayCOM];

    // Переменная хранящая завершено ли получения данных.
    boolean finishReceiveData = false;

    // Переменная хранящая индекс текущего char в массиве хранящего пакет данных.
    int indexCharInArray;

    // Переменная хранящая ошибку длины полученных данных.
    boolean errorLengthReceiveData = false;

    void setup()
    {
      Serial.begin(9600);
    }

    void loop() {
      // Получение данных с Serial порта
      GetReceiveDataFromSerial();

      // Ошибка длинны данных.
      if (errorLengthReceiveData)
      {
        Serial.println("Данных пришло больше.");
        // Очистка переменных получения данных, после получения данных.
        ClearReceiveDataVariable();

        // Обнуляем переменую errorLengthReceiveData.
        errorLengthReceiveData = false;
      }
      else if (finishReceiveData)
      {
        //Serial.println(receiveCharArrayCOM);
        TFTscreen.background(0, 0, 0);
        TFTscreen.stroke(255, 255, 255);
        TFTscreen.setTextSize(2);
        TFTscreen.text(DATETIME, 0, 20);
        // Очистка переменных получения данных, после получения данных.
        ClearReceiveDataVariable();
      }
    }

    /// <summary>
    /// Получение данных с Serial порта
    /// </summary>
    void GetReceiveDataFromSerial()
    {
      // Крутимся в цикле, до тех пор пока есть данные для чтения.
      while(Serial.available())
      {
        // Объявляем переменную и сохрянем 1 char нее.
        char incomingChar = (char)Serial.read();

        // Проверяем, если пришел символ новой строки или символ конца строки.
        if(incomingChar != '\n' &&
          incomingChar != '\0')
        {
          // Заполняем массив.
          DATETIME[indexCharInArray] = incomingChar;

          // Проверяем индекс массива.
          if ((indexCharInArray+1) < receiveSizeArrayCOM)
          {
            // Увеличеваем индекс массива.
            indexCharInArray++;
          }
          else
          {
            // Данных больше, чем можем вместить.
            // Очень коварная ситуация, если мы выдем за пределы массива, отладка будет очень тяжелая.
            errorLengthReceiveData = true;
            break;
          }
        }
        else
        {
          // Увеличеваем индекс массива.
          DATETIME[indexCharInArray] = '\0';

          // Взводим флаг, данные получены.
          finishReceiveData = true;
        }
      }
    }

    /// </summary>
    /// Очистка переменных получения данных, после получения данных.
    /// </summary>
    void ClearReceiveDataVariable()
    {
      indexCharInArray = 0;
      memset(DATETIME,'\0',receiveSizeArrayCOM);

      finishReceiveData = false;
    }
     
    Читает все данные до символа конца строки ('\n') и сохраняет в Ваш массив, от нее можете отталкиваться. Впрочем, данный код можно использовать, добавив после отправки данных символ '\n', на стороне Питона.

    Кодировка UTF8, когда-то делал на C# приложение использовал ее.

    UPD. C TFT не работал, не подскажу.
     
    Последнее редактирование: 9 янв 2016