Я отправляю строку 1 и строку 0, закодированные с помощью ASCII, из Python в программу C на моем Arduino UNO через последовательный порт.
Я могу получить закодированные данные в C, который составляет 0x31для 1 и 0x30 для 2, это то, что я ожидал, так как это ASCII-гекс для char 1 и char 2.
Я могу читать / использовать это в состоянии ASCII. Но теперь я хочу, чтобы эти данные: 0x31 превратились в int 1 или char 1, а 0x30 - в int 0 или char 0 в C. Я попытался atoi(receivedData)
(что буквально: ASCII в int), но это не такработа, я отправил atoi(receivedData)
результат обратно и я получил 0x00 в Python.
Как я могу это сделать?
Вот мой код C :
uint8_t receivedData;
void uart_init()
{
// set the baud rate
UBRR0H = 0;
UBRR0L = UBBRVAL;
// disable U2X mode
UCSR0A = 0;
// enable receiver & transmitter
UCSR0B = (1<<RXEN0) | (1<<TXEN0); // Turn on the transmission and reception circuitry
// set frame format : asynchronous, 8 data bits, 1 stop bit, no parity
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
}
void receive(void)
{
loop_until_bit_is_set(UCSR0A, RXC0);
receivedData = UDR0;
}
void transmit(uint8_t dataa)
{
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = dataa
}
void processData() {
cleanUDR0();
// 0x31 is ascii code for 1, 0x30 is 0
// led turns on if input == 1 (0x31) and turns off if led == 0 (0x30)
receive();
transmit(receivedData);
int temporary = atoi(receivedData);
if (temoraray == 1){
PORTD = 0xff; // Turning LEDs on
}
else if (temporary == 0){
PORTD = 0x00; // Turning LEDs off
}
}
void cleanUDR0(void) {
unsigned char y;
while (UCSR0A & (1<<RXC0)) y=UDR0;
}
int main(void)
{
DDRD = 0xFF;
uart_init();
While(1) {
processData();
}
}
Вот мой Python код:
import time
import threading
import serial
class SerialT(threading.Thread):
connected = False
serialC = serial.Serial("COM4", 19200)
while not connected:
serin = serialC.read()
connected = True
while True:
myStr1 = '1'
myStr0 = "0"
serialC.write(myStr1.encode('ascii'))
print(int(chr(ord(serialC.read()))))
time.sleep(2)
serialC.write(myStr0.encode('ascii'))
print(int(chr(ord(serialC.read()))))
time.sleep(2)