TTLシリアルには、2つの単方向データ回線があります。それぞれは、高低両方の送信者によって駆動されます。0ビットは0V、1ビットはVCCで表されます。
レシーバーのピンは入力に設定する必要があります。
そのため、マイクロコントローラーがバイトを送信するには(8-N-1フロー制御なし)、次のようなことができます。
#define BAUDRATE 9600
#define DELAY (SYS_CLK/BAUDRATE)
#define UART_BITBANG_OFF UART_BITBANG_PORT |= _BV(UART_BITBANG_PIN)
#define UART_BITBANG_ON UART_BITBANG_PORT &= ~ _BV(UART_BITBANG_PIN)
#define UART_BITBANG_BIT(bit) {if (bit) UART_BITBANG_ON; else UART_BITBANG_OFF; _delay_us(DELAY);}
void uart_bitbang_init(void)
{
UART_BITBANG_DDR &= ~ _BV(UART_BITBANG_PIN); // TX output
}
void uart_bitbang_putc(uint8_t c)
{
UART_BITBANG_BIT(1)
UART_BITBANG_BIT((c & 0x1) == 0);
UART_BITBANG_BIT((c & 0x2) == 0);
UART_BITBANG_BIT((c & 0x4) == 0);
UART_BITBANG_BIT((c & 0x8) == 0);
UART_BITBANG_BIT((c & 0x10) == 0);
UART_BITBANG_BIT((c & 0x20) == 0);
UART_BITBANG_BIT((c & 0x40) == 0);
UART_BITBANG_BIT((c & 0x80) == 0);
UART_BITBANG_BIT(0);
}
(このコードは、元々反転TTLシリアル用であったため、少し逆読みします)
もちろん、ほとんどのMCUにはこれをすべて行うハードウェアUARTがあります。
スコープに表示されるものは次のとおりです。
https://www.pololu.com/docs/0J25/4.a
シリアルを説明するladyadaからの素晴らしいビデオ:http ://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/