Мы программируем картинку и диагностировали, что если мы отправим данные на последовательный порт, когда он пытается отправить данные нам, программа заблокируется (и наш код Python, и гипертерминал вылетят при тестировании). Он работал в гипертерминале и вводил его медленно (> 0,5 секунды между ударами) и вылетал при ударе по клавиатуре. Итак, что мы сделали, так это ввели time.sleep, который длиннее 0,5 секунды, но он все еще не работает.
Вот наш тестовый код.
import serial
import time
ser = serial.Serial("COM1")
ser.baudrate=2400
while 1:
for i in range(23):
ser.write(0x41)
time.sleep(.5)
print("ok")
rec = ser.read()
rec2 = ser.read()
rec3 = ser.read()
print(rec)
print(rec2)
print(rec3)
for i in range(23):
data = ser.read()
print(data)
print("ok")
time.sleep(5)
наша функция получения данных. Раньше мы отправляли "ok" каждый раз, когда он получал char (именно так мы знаем, что он зависает после 3 итераций). Мы вынесли его из цикла, чтобы увидеть, является ли это причиной проблемы, и это не так. Он вообще не отправляет «ОК» с этим кодом.
unsigned char receiveData(unsigned char *rxData, int length){
// 1. Flag bit, RCIF, will be set when reception is complete and an interrupt will be generated if enable bit, RCIE, was set.
char send[3] = "ok";
int index = 0;
if(rxData==(void*)0 || rxInitialized==FALSE) return FAILURE;
while(index<length){
while(PIR1bits.RCIF==0);
rxData[index]= RCREG;
Delay1KTCYx(5);
index++;
}
configureTransmission();
sendData(send,3);
// 2. Read the RCSTA register to get the 9th bit (if enabled) and determine if any error occurred during reception.
// 3. Read the 8-bit received data by reading the RCREG register.
// 4. If any error occurred, clear the error by clearing enable bit CREN.
return SUCCESS;
}
receiveData
неверна — флагRCIF
устанавливается, когда приемный буфер заполнен, и сбрасывается, когдаRCREG
пуст, т.е. читать. - person detly   schedule 19.11.2010