1

我编写了一个小型 C# 应用程序,将字节写入 COM 端口:

SerialPort serialPort = new SerialPort
{
    PortName = "COM6",
    BaudRate = 57600,
    DataBits = 8,
    Parity = Parity.None,
    StopBits = StopBits.One,
    Handshake = Handshake.None
};

serialPort.DataReceived += delegate
{
    var read = serialPort.ReadByte();
    Console.WriteLine("Recv: {0}", read);
    Trace.WriteLine(read);
};

serialPort.Open();

for (Byte i = 0; i < 250; i++)
{
    Console.WriteLine("Send: {0}", i);
    serialPort.Write(new[] {i}, 0, 1);
    Thread.Sleep(250);
}

现在我用我的 ATMega328P 接收这些信号并将我收到的信息发回:

void InitUart()
{
    // Enable receiver and transmitter
    UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);

    // Set baud rate
    UBRR0H = (UART_BAUD_PRESCALE  >> 8);
    UBRR0L = UART_BAUD_PRESCALE;

    // Set frame: 8data, 1 stop bit
    UCSR0C |= (1 << USBS0) | (1 << UCSZ00) | (1 << UCSZ01);

    // Enable all interrupts
    sei();
}

void UART_Send(char b)
{
    UDR0 = b;
    while ((UCSR0A & (1 << TXC0)) == 0) {};
}

ISR(USART_RX_vect)
{
    char b = UDR0;
    _delay_ms(125);
    UART_Send(b);
} 

但是会发生什么:

Send: 0
Recv: 128
Send: 1
Recv: 129
Send: 2
Recv: 130
Send: 3
Recv: 131
Send: 4
Recv: 132
Send: 5
Recv: 133
Send: 6
Recv: 134
Send: 7
Recv: 135
Send: 8
Recv: 136
Send: 9
Recv: 137
Send: 10
Recv: 138
Send: 11
Recv: 139
Send: 12
Recv: 140
Send: 13
Recv: 141
Send: 14
...
Recv: 250
Send: 123
Recv: 251
Send: 124
Recv: 252
Send: 125
Recv: 253
Send: 126
Send: 127
Send: 128
Recv: 128
Send: 129
Recv: 129
Send: 130
Recv: 130
Send: 131
Recv: 131
Send: 132
Recv: 132
Send: 133
Recv: 133
Send: 134
Recv: 134
Send: 135
Recv: 135
Send: 136
Recv: 136
Send: 137
Recv: 137
Send: 138
Recv: 138
Send: 139
Recv: 139
Send: 140
Recv: 140

所以它上升到 127 然后它突然正确了。

不知何故,字节值有 128 个差异,但我无法掌握它。

编辑:经过更多测试后,我注意到了这一点:

Send: 0 (0)
Recv: 128 (10000000)
Send: 1 (1)
Recv: 129 (10000001)
Send: 2 (10)
Recv: 130 (10000010)
Send: 3 (11)
Recv: 131 (10000011)
Send: 4 (100)
Recv: 132 (10000100)
Send: 5 (101)
Recv: 133 (10000101)

我似乎补码与 C# 和 AVR C 不同。

4

2 回答 2

0

解决方案是我为串行端口使用了错误的速度,因此数据包无法正确到达。

于 2013-01-14T20:13:24.860 回答
0

我在我的项目中遇到了类似的问题,但我是 c#(和 VB)的新手,它是关于 ASCI 和 ASCII 的。您在 AVR 中的代码接缝很好。

我做了什么(在VB中):

将 byte_conv(10) 调暗为字节

byte_conv(0) = Pg

...

comPort.Write(byte_conv, 0, 10)

在你的情况下:

将 byte_conv(1) 调暗为字节

byte_conv(0) = 我

comPort.Write(byte_conv, 0, 1)

于 2012-12-23T23:19:37.530 回答