Serial read в char[] - глюк
- Войдите на сайт для отправки комментариев
Пнд, 12/12/2011 - 03:21
Сначала думал МК глючит, я ему полярку намедни перепутал до треска и дыма, иногда перешивать приходится теперь (но для тренировок сойдет). Однако на новом МК та ж беда (Атмега8Л)
сhar RX_char[] = ""; void RX() { byte RX_i = 0; char b; RX_char[0] = '\0'; while (Serial.available()) { b = Serial.read(); if(b == 13) break; RX_char[RX_i] = b; RX_i++; RX_char[RX_i] = '\0'; //if(RX_i > 3) break; } }
Если отослать через терминал больше 4-х символов - МК уходит в перезагрузку (начинает исполняться setup()). За этим и стоит закомменченная строчка if(RX_i > 3), так хотя бы данные считываются при следующем цикле из буфера. Отчего такое происходит и как побороть?
Да, и еще: отчего sizeof(RX_char) всегда равен единице?
Да, и еще: отчего sizeof(RX_char) всегда равен единице?
Ибо
Здесь вы задали массив символов, под который выделена одна-единственная ячейка памяти (которой хватает лишь на то, чтобы записать туда стандартный для C терминатор строки "\0"). При попытке записи в эту переменную более чем одного символа (переменные выравниваются на границу слова) происходит выход за границы той области памяти, которая отведена под массив. С непредсказуемыми последствиями. В вашем случае это может быть перезапись какой-либо важной переменной (например, указателя на функцию), что и приводит к сбросу МК. Собираетесь записывать в этот массив, например, до 10 символов? Ну и произведите соответствующую инициализацию:
После этого sizeof(RX_char) всегда будет равен 11.
В том то и дело, что очень хочется динамический массив. Вроде такой пример был описан в хелпе на arduino.cc. То есть инициализируем как у меня и дописываем в нужном месте \0..
А почему очень хочется? Для экономии памяти? А не думали, сколько этой самой памяти займет информация, необходимая для учета выделенных участков памяти и возвращения в кучу болше неиспользуемых участков?
Ради 1-2 строк переменной длины, по-моему, совершенно не стоит заморачиваться. Ради десятка коротких строк - тоже. Овчинка выделки не стоит.
Но если все же очень хочется, тогда, например, так:
(взято отсюда, также можно почитать здесь и во многих других местах). При этом не стоит забывать о возвращении больше не используемой памяти (delete()). Иначе очень быстро исчерпаем кучу...
Хотелось именно экономить память, но я вижу - с динамическими только больше ее уходит :) Спасибо!
Просто разные данные надо читать, и поменьше и побольше, хотелось универсальную функцию чтения написать которая возвращала бы массив нужной длинны (прочитано до #13). Но, вижу, проще сделать по размеру максимально передаваемых данных.
Спасибо!