Последовательная связь не работает сразу после загрузки
Я пытаюсь установить связь между программой на Arduino Uno и программой на ПК через USB. У меня всё более-менее работает. Единственная проблема заключается в том, что она не работает, когда я запускаю программу для ПК первый раз после загрузки кода Arduino через Arduino IDE (версия 2:1.0.5+dfsg2-4). У него какое-то странное поведение. Конечно, я мог бы найти обходной путь, но надеюсь, что кто-нибудь знает, в чем причина этой проблемы и есть ли хороший способ ее решения.
Эта программа должна отправлять обратно каждый полученный байт:
void setup () {
Serial.begin(9600);
while (!Serial) {}
}
void loop () {
if (Serial.available()) {
Serial.write(Serial.read());
}
}
Эта программа дважды отправляет байты от 0 до 255 в Arduino и выводит каждый полученный байт. Он написан на Scala и использует библиотеку Java RXTX для последовательной связи. Я использую Debian Linux.
import gnu.io.CommPortIdentifier
import gnu.io.SerialPort
object SerialTest extends App
{
val portId = CommPortIdentifier.getPortIdentifier("/dev/ttyACM0")
val port = portId.open(getClass.getName, 0).asInstanceOf[SerialPort]
port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE)
val in = port.getInputStream
val out = port.getOutputStream
for (i <- 0 until 512) out.write(i)
while (true) print(in.read + " ")
}
Вместо 512 байт, которые он должен получить, принимаются только последние 44 байта. Кроме того, первые байты, которые получает программа, обычно неверны. Когда я запускаю программу второй раз, я получаю желаемый результат.
Try 1: 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
Try 2: 186 58 93 157 221 29 151 167 183 199 215 231 247 7 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
Try 3: 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
Try 4: 221 29 151 167 183 199 215 231 247 7 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
Desired: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
Если я позволю программе подождать 2 секунды где-нибудь между val portId = ...
и записью в выходной поток, это сработает. Но есть способ получше, не так ли?
@Paul, 👍1
Обсуждение1 ответ
Лучший ответ:
При первом открытии последовательного порта на ПК Uno сбрасывается и входит в загрузчик. Через две секунды ваш скетч начнет работать.
К тому времени вы уже отправили нагрузку своих данных в Uno, которую он игнорирует, поскольку это недействительные команды загрузчика.
Когда ваша программа завершает работу, она оставляет порт в другом состоянии (RXTX — это ерунда, которая не очищает себя после завершения программы). Это состояние включает в себя отключение сигнала DTR.
При отключенном сигнале DTR Uno не сбрасывается при открытии порта. Таким образом, когда вы запускаете программу второй раз, скетч уже запущен и все работает нормально.
Вы можете переключить управление сигналом DTR в Linux, установив или сняв флаг hupcl
на tty:
Disable DTR control:
$ stty -F /dev/ttyACM0 -hupcl
Enable DTR control:
$ stty -F /dev/ttyACM0 hupcl
- Java NetBeans отправляет значение и получает значение от Arduino
- Какова самая высокая скорость передачи данных, которая может работать между Android-устройством и Ардуино, подключенным к HC05?
- Чтение строки из serial дает нулевые строки с JSSC
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
Если вы скажете, что другой вопрос «более или менее такой же», тогда ваш вопрос следует закрыть как дубликат. Чтобы задать новый вопрос, вам нужно объяснить, чем ваш отличается от него., @Chris Stratton
Непонятно, в чем именно заключается ваша проблема, но вы можете подумать о том, чтобы установить задержку в несколько секунд между открытием последовательного порта и попыткой связи, чтобы позволить загрузчику истечь тайм-аут, или лучше поискать эхо тестовых данных. перед реальными данными или изменить конфигурацию последовательного порта, чтобы отключить манипуляции со строкой состояния модема при открытии, что вызывает сброс, или изменить проводку платы или удалить загрузчик. Также полностью настройте расширенные настройки последовательного порта, а не просто надейтесь, что последний использованный порт установил то, что вы хотите., @Chris Stratton
Зачем использовать < while(!Serial)>, когда вы используете UNO??, @Dat Ha
Единственный «лучший способ», чем задержка, — это задержка с последующей положительной проверкой связи и повторением, если необходимо, до успеха, как уже упоминалось. Или, в первую очередь, чтобы предотвратить сброс, но это рискованно, поскольку зависит от модификации, которая может быть сделана не в каждом случае., @Chris Stratton
@ChrisStratton Как насчет «отключить манипулирование строкой состояния модема»? Я понятия не имею, о чем вы говорите, и Google мне не друг в этом вопросе. Если это может сработать, как мне это сделать?, @Paul
http://arduinoprosto.ru/q/4078/why-does-my-arduino-seem-to-reboot-every-time-that-i-open-serial-monitor или http://arduino.stackexchange. com/questions/640/arduino-serial-port-reset-in-serial-monitor-python или http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection, @Chris Stratton