بیت بنگ

بیت بنگ روشی برای ارتباطات سریال با پیاده‌سازی نرم‌افزاری به‌جای سخت افزار اختصاصی می‌باشد. برنامه نرم‌افزاری مستقیماً چگونگی پایه‌های میکروکنترلر را سامان‌دهی کرده یا نمونه برداری کرده و وظیفه همه پارامترهای سیگنال از جمله زمان بندی، سطوح، هم‌زمانی و غیره را برعهده دارد. در مقایسه با بیت بنگ، سخت افزار اختصاصی (مانند یک مودم، یوارت یا شیفت رجیستر) همه این پارامترها را کنترل کرده و یک اینترفیس داده بافر شده در دیگر سیستم‌ها فراهم می‌کند، به فرمی که نرم‌افزاری برای دمدوله کردن سیگنال مورد نیاز نمی‌باشد. فرایند ببت بنگ را می‌توان با قیمت بسیار پایینی انجام داد و برای نمونه در سیستم‌های امبدد (توکار) به کار گرفت.
هرچند گاهی بیت بنگ کردن نوعی هک کردن به حساب می‌اید، ولی این امکان را می‌دهد که با کمترین یا بدون هرگونه تغییراتی، از پروتکل‌های گوناگون برای ارتباط با انواع دستگاه‌های ارتباط سریال از جمله انواع مودم‌های وایرلس (بی سیم) FSK و GFSK و FM و PLC (دیتا روی برق شهر) و GSM و پیامک SMS و اینترنت GPRS و مکان یاب GPS و پل یا بریج‌های USB به سریال و SPI و I2C و شبکه اترنت (Ethernet) و کارت خوان‌های مغناطیسی و الکترومغناطیسی RFID برای کاربردهای شناسایی و ساعت زنی ، ماژول‌های اثر انگشت و تشخیص نشت گاز و سنسورهای گوناگون و غیره بهره گرفت.

مشکلاتی هم در این روش وجود دارد. پروسه شبیه سازی نرم‌افزاری توان پردازشی بیشتری نسبت به سخت افزار اختصاصی مصرف می‌کند. میکروکنترلر نسبت به حجم دیگر وظایفش، بیشتر زمان خود را صرف خواندن یا نوشتن نمونه‌ها از پایه ورودی یا روی پایه خروجی می‌کند. سیگنال تولید شده شامل جیتر و گلیچ‌های بیش‌تری خواهد بود، مخصوصا اگر پردازنده در هنگام ارتباط سریال وظایف دیگری را هم پردازش نماید. با این وجود، اگر برنامه بیت بنگ به حالت وقفه(اینتراپت) سیگنال انجام شود، این مشکل کم‌تر نمود پیدا می‌کند مخصوصا اگر سیگنال‌های کنترلی مانند RTS و CTS و DCD موجود باشند.

نمونه کد به زبان C 
// transmit byte serially, MSB first
void send_8bit_serial_data(unsigned char data)
{
   int i;

   // select device
   output_high(SD_CS);

   // send bits 7..0
   for (i = 0; i <8; i++)
   {
       // consider leftmost bit
       // set line high if bit is 1, low if bit is 0
       if (data & 0x80)
           output_high(SD_DI);
       else
           output_low(SD_DI);

       // pulse clock to indicate that bit value should be read
       output_low(SD_CLK);
       output_high(SD_CLK);

       // shift byte left so next bit will be leftmost
       data <<= 1;
   }

   // deselect device
   output_low(SD_CS);
}

منابع

پیوند به بیرون 
Asynchronous Serial (RS-232)
 Notes on bit-banging async serial
 Bit banging for Async Serial Communication
 Bit banging for RS-232

I2C Bus
 I2C on AVR using bit banging

SPI Bus
 Efficient bit-banged SPI for 8051 microcontroller 

انتقال داده
پردازش سیگنال
سامانه‌های توکار
مدارهای دیجیتال