COM-порт

cxem
Offline
Зарегистрирован: 17.01.2014

COM-порт
Установил MAX3232, а проверить связку Arduino + Персоональный Компьютер не смог.
Несколько раз переделал схему. Изображение

Установил на ПК две программы: PORTMON и Test_MAX232
В Arduino код:





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

void loop()
{ 
  if (Serial.available())
  Serial.write(Serial.read()); 
}

 

PORTMON -мониторит COM-порт
Test_MAX232 -Open COM1(открыть порт)->Write port(отправить в Arduino)->Read port(читать из Arduino)->Close port(закрыть порт)

Вопрос: как сделать полноценную проверку COM-порта?
-скорость и т.д.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверьте max232  вообще работает или нет.

замкните rx и tx у вашей платы и в ардуино в терминале отправляйте что нибудь и должно тоже самое приходить.

когда точно будете знать что работает тогда уже и ардуину можно цеплять

cxem
Offline
Зарегистрирован: 17.01.2014

Простую проверку связи ПК + Arduino я сделал с помощью Test_MAX232.
Всё отправляет и всё читает.
Надо установить на ПК серьёзную программу и проверить насколько надёжна связь.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

мне лично эта понравилась. сам пользовался когда беспроводной uart тестировал 

http://yadi.sk/d/irKYLKYjH5Mvb

внизу показывает релаьную скорость и количество ошибок. тестировать можно на разной скорости

cxem
Offline
Зарегистрирован: 17.01.2014

Спасибо.

Скетч который я выложил в первом посту, это просто "перемычка"  Tx<->Rx

Может кто напишет скетч более правильный.

Чтобы было видно, как общаются ПК и процессор ATmega. 

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

сначала в железе замкните и прогоните на разной скорости а потом уже ваш скетч

cxem
Offline
Зарегистрирован: 17.01.2014

115200 нормально работает.    Test_MAX232_115200

Вот этот скетч обратно шлёт кразябяки.

Его можно поправить.



int incomingByte = 0;	// для хранения полученного байта

void setup() {
	Serial.begin(115200);	// устанавливаем последовательное соединение
}

void loop() {
	if (Serial.available() > 0) {  //если есть доступные данные
		// считываем байт
		incomingByte = Serial.read();

		// отсылаем то, что получили
		Serial.print("I ATmega received: ");
		Serial.println(incomingByte, DEC);
	}
}

Изображение

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

надо скорость постепенно увеличивать. 115200 может прост оне потянуть ваш переходник на плате

и зря текст отправляете лишний

Seth
Offline
Зарегистрирован: 01.02.2014

Всем привет. Можно здесь вопрос задать?

Кто знает как работает встроенный в редактор монитор порта. Дело в том что он работает правильно и читает порт без ошибок. В отличии от того что я написал. Встроенный монитор принимает сообщение полностью и с любой скоростью. Моя же реализация может прочитать половину сообщения, а при следующем обращении дочитать остаток. Такое не часто но все же случается. Это происходит когда порт считывается в тот момент когда идет передача и считывается он быстрее чем передает контроллер. Вот и подумал может кто разбирается в англоязычном сайте и может вытащить код по работе монитора. Как там это реализованно? Нигде нормальной инфы по порту не могу найти.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вот программа для отправки обратно числа больше чем 9

int resultInt;
void setup(){
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()>0) {
    resultInt = serReadInt();
    Serial.println(resultInt);
  }
  delay(1000);
}
int serReadInt()
{
  int i, serAva;
  char inputBytes [7]; // массив для хранения байтов
  char * inputBytesPtr = &inputBytes[0]; // указатель на первый элемент массива

  if (Serial.available()>0) // проверяем есть ли данные
 {
    delay(5);//чутка ждем, чтобы все данные прошли
    serAva = Serial.available(); // получаем количество доступных байт
    for (i=0; i<serAva; i++) // загружаем байты в массив
      inputBytes[i] = Serial.read();

    inputBytes[i] = '\0'; // дописываем NULL в конец массива
    return atoi(inputBytesPtr); // Вызываем atoi функцию, стандартная функция С
  }
  else
    return -1; // Возвращаем -1, если ничего не получили
}

если отправлять от 0 до 9 то пойдет и ваша программа

Seth
Offline
Зарегистрирован: 01.02.2014

Я так смотрю тут гуру все по ком порту. Насколько мне удалось понять логику работы порта. Эта программа работает правильно. А кракозябры это не что иное как символы конца строки и возврата каретки, ака \n и \r. Которые ты сам отправляешь используя println(), используй print() и кракрзябр не будет.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я настолько не интересовался работой com порта. но есть разработчик который писал программы для общения устройств по uart. что конкретно у него спросить?

mr-Ayaz
Offline
Зарегистрирован: 03.02.2014

Здравствуйте.

Помогите пожалуйста с кодом. Я имею команды которыми можно управлять счётчик они в HEX формате но я незнаю как их отправить через Arduino на счётчик отправляю одно а на PuTTy вижу другое

char code1 = {0x00, 0xE4, 0x9A, 0xE0, 0x71, 0xAA, 0xFB, 0x0C};
 
void setup() {
        Serial.begin(9600);     // открываем последовательный порт 
                                //и задаем скорость обмена 9600 бод
}
 
void loop() {
 
        // отправляем данные

                Serial.print(code1, HEX);
               
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

что отправляете понятно. а что получаете??

mr-Ayaz
Offline
Зарегистрирован: 03.02.2014

мне нужно отправить команду 0E 49 AE 07 1A AF BC

а в мониторинге порта вижу 37 99 E8 AB 02 1E не понимаю почему

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

отправляете 7 байт а получаете 6?

mr-Ayaz
Offline
Зарегистрирован: 03.02.2014

Простите я ошибся давайте обьясну по подробнее у меня есть протокол обмена с счётчиком.

Например с помошью программы DockLight v2 я отправляю команду 00 E4 9A E0 71 AA FB 0C и счётчик отвечает на него и отключает внутреннее реле.

А тепер я хочу отправить этуже команду с Arduino Mega но у меня чтото не получается помогите пожалуйста буду очень благодарен  

OlegMi
Offline
Зарегистрирован: 06.02.2014

В 12-ой строчке поставте Serial.write(Code1, 8);

flashman
Offline
Зарегистрирован: 04.02.2014

 

Добрый вечер. В программировании я не так давно, по этому разрешите обратиться к Вам. Не получается простая задача - не могу вывести массив данных на COM порт. Точнее выводит, но не значения массива, а какие-то квадратики.
 

for (i=0; i<m; i++)
  for (j=2; j<=k; j++)
    {
      Serial.write(myarray[i][j]);
   {

Заранее СПАСИБО!!!

Seth
Offline
Зарегистрирован: 01.02.2014

Ну а ты как хотел? Что в массиве, строки, числа??? И как ты их считываешь? Ардуин 8ми битный, а комп 32х битный! Они символы поразному читают. Тебе самому побайтово считывать нужно.

maksim
Offline
Зарегистрирован: 12.02.2012

Seth пишет:
 Ардуин 8ми битный, а комп 32х битный! Они символы поразному читают.

А 64 битный вообще по третьему читает... Ну-ка раскажите нам подробнее как разрядность процессора влияет на таблицу кодов ascii ? 

Seth
Offline
Зарегистрирован: 01.02.2014

Хотел ссылку дать, но не дам. Не помню где прочитал. Там было написанно что в ардуино на символ идет 1 байт, а в 32х разрядных системах 4 байта.

Ну а если передавать кирилицу то квадратики будут.

инт занимает 4 байта, а не один. Это тоже учитывать нужно. И так каждый тип дпнных имеет свой размер. Поэтому его нужно читать соответственно.

Если передать инт, а принять как чар. то это будет четыре квадратика, а не один инт.

Вот и все что я хотел сказать.

maksim
Offline
Зарегистрирован: 12.02.2012

Ясно. Главное никому не давайте рецепта этой каши.

Seth
Offline
Зарегистрирован: 01.02.2014

Дайте свой рецепт, вместо того чтобы умничать.

Зачем вы проверяете уровень моих знаний, вы знаете больше? Помогите человеку!

OlegMi
Offline
Зарегистрирован: 06.02.2014

Seth, большая просьба - не давать совет в том в чём не разбираешься

Seth
Offline
Зарегистрирован: 01.02.2014

В чтении файлов? СОМ порт именно как файл читается, я разбираюсь. И писал их и читал потом и все прекрасно работало.

OlegMi
Offline
Зарегистрирован: 06.02.2014

flashman попробуйте организовать вывод, например, в шестнадцатиричном виде, а потом посмотри коды в ascii таблице. (может быть ждешь цифровой вывод, а выводится символы типа int 0 и char "0")

OlegMi
Offline
Зарегистрирован: 06.02.2014

seth, вам сколько лет? может быть еще пиписьками померимся?

maksim
Offline
Зарегистрирован: 12.02.2012

Ему уже помогли в другой ветке.

Дело тут больше не в знании - знать все невозможно, а в понимании. А вот зачем советовать, то чего сами не понимаете это уже вопрос к вам. Или считаете что вводить людей в заблуждение это правильно?

Вот вы ляпнули не пойми чего, а ведь кто то ваши слова за истину воспримет... А если уж начали что то советовать в чем сами до конца не разобрались, то копайте до конца и сами для себя выясняйте что же вы насоветовали и так ли это есть на самом деле. А просто вывалить кашу - это не есть помощь.

Mattew
Offline
Зарегистрирован: 26.12.2014

Здравствуйте. Использую AtMega32А в качестве ардуино. Программа стандартная:

int incomingByte = 0;   // для хранения полученного байта
 
void setup() {
    Serial.begin(9600); // устанавливаем последовательное соединение
}
 
void loop() {
    if (Serial.available() > 0) {  //если есть доступные данные
        // считываем байт
        incomingByte = Serial.read();
 
        // отсылаем то, что получили
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
    }
}

С передачей через ком порт та же чепуха - кракозябры. Все проверял - скорость, четность, биты.... и все ничего... пробовал ком порты на CH340 и на FTDI - без разницы... сами порты работают нормально. Перечитал и испробовал здесь предложенные варианты все какие возможно... и ничего... Может кто то сталкивался с подобным контроллером и такой ошибкой?

nkvd
Offline
Зарегистрирован: 03.05.2017

Подскажите как сделать чтоб функция выполнялась лишь при соединении телефона с блютузом и наоборот. Спасибо. Нс-5 модуль.

strarbit
Offline
Зарегистрирован: 12.06.2016

А подробнее, какая функция?