عنوان مقاله :
VC++ و VB ارتباط سریال کامپیوتر و میکروکنترلر با استفاده از
ارائه دهنده :سجاد صادقی
دانشجوی برق دانشگاه آزاد سبزوار
مقدمه :
در این مقاله سعی در تشریح چگونگی کار با پورت سریال و ایجاد ارتباط بین دو
کامپیوتر و یا کامپیوتر و میکروکنترلر را داریم.
همچنین چگونگی ارتباط با مودم و انتقال اطلالالالاعات از طریق آن بررسی شده است . در
استفاده ACTIVEX و یا کنترل های API برای ارتباط با روالهای VB اینجا ما از
نیز صادق VC++ کرده ایم که البته توضیحات ذکر شده در زبانهای دیگری مانند
میباشد .که به تشریح آن خواهیم پرداخت
-------------------------------------
در این مقاله سعی در تشریح چگونگی کار با پورت سریال کامپیوتر و ارتباط آن با کامپیوترهای دیگر و یا با
میکروکنترلر را داریم.
برای ارتباط با روالهای VB همچنین چگونگی ارتباط با مودم و انتقال اطلاعات از طریق آن بررسی شده است . در اینجا ما از
VC++ استفاده کرده ایم که البته اکثر توضیحات ذکر شده در زبانهای دیگری مانند ACTIVEX و یا کنترل های API
نیز صادق میباشد .که به تشریح آن خواهیم پرداخت .
نامیده میشوند . و هر Com١,Com٢,Com هر کامپیوتر دارای تعدادی پورت سریال میباشد که به ت رتیب به نامهای ,, ٣
و اسکنر به COM کدام ممکن است که برای ارتباط با وسیله خاصی در نظر گرفته شود . مثلا’ ممکن است موش به ١
متصل شود . پورت PC و هر دستگاه سریال دیگری نیز به همین صورت بروی یکی از پورتهای سریال نصب شده در COM٢
به روش سریال نمونه ای از نحوه ’ ارتباط I/O. سریال کانالی برای انتقال اطلاعات و دریافت آن به صورت بیت به بیت است
بین دو وسیله استفاده می شود این روش (ONE TO ONE) حمایت شده توسط ویندوز است این روش هنگام ارتباط
میتواند با استفاده از کابل یا مودم یا استفاده از فرستنده گیرنده های مادون قرمز ایجاد گردد .ارتباط سریال با استفاده از
بسیار شبیه کار با فایلها میباشد . همچنین ویندوز دارای توابعی برای باز یا بسته کردن و دستکاری مشخصات API روالهای
را به زبان پورت ترجمه نمود و آنرا به فرم CPU پورت میباشد . برای کار با پورت سریال توابعی موجود است تا بتوان اطلاعات
بیت به بیت درآورد تا برای ارسال آماده شوند همچنین در حالت دریافت اطلاعات نیز با کنار هم قرار گرفتن این بیتها یک
برای پردازش فرستاده میشود . البته این فرایند توسط لایه های مختلفی صورت میگیر د ویندوز CPU بایت ایجاد شده و به
دیگر API استفاده میکند. البته با وجود روالهای COMM.DRV برای کار با پورت سریال از یک درایور انتقال سریال بنام
نیازی به چنین ارتباطهای سطح پائینی برای برنامه نویس احساس نمیشود . به عنوان یک برنامه نویس بسته به نیاز خود
مهم و API استفاده نمائید . در این مقاله ما به ذکر برخی از روالهای ACTIVEX و یا از یکسری API میتوانید از روالهای
خواهیم پرداخت درانتها COMM بنام ٣٢ VISUAL STADIO PRO ارئه شده همراه با ACTIVEX توضیح یک
نیز به طریقه’ ارتباط با میکروکنترلر خواهیم پرداخت .
. COMM قدم اول : ایجاد ارتباط با پورت سریال توسط ٣٢
کردن آنها set گنجانده شده است که با property یکسری COMM برای شروع به کار و دسترسی به پورت توسط ٣٢
ها میپردازیم. property میتوان پورت را آماده دسترسی نمود . در زیر به توضیح این
mscomm١.Comport=[value] کردن شماره’پورت Set - ١
١٦ باشد. اگر پورتی با شماره’مورد - مینماید. این مقدار میتواند بین ٠ SET شماره پورت مورد نظر را property این
نظر شما موجود نباشد یک خطا رخ میدهد که میتوان از آن برای اطمینان از انجام کار سود برد.
mscomm١.setting = [string value] کردن مشخصات پورت set - ٢
امکان تعریف مشخصات پورت را میدهد .این مشخصات بایستی به صورت یک رشته تعریف شود.این رشته property این
میباشد “ boud rate , parity bit , data bit ,stop bit “ شامل تعریف
مقادیر معتبر برای این مقادیر را در جدول زیر نشان داده شده است .
Boud rate
110 –300 –600 –1200 – 2400 – 4800 – 9600( defult ) –14400- 19200 – 28800
38400 – 56000 – 57600 - 115200 - 128000 - 256000
Parity bit M ( mark) – E ( even ) – N ( none( defult ) ) – O ( odd ) - S ( space )
Data bit 4 – 5 – 6 – 7 – 8 ( defult )
Stop bit 1( defult ) – 1.5 – 2
portopen = [value bolean] - ٣
FALS پورت مورد نظر باز شده و در اختیار ما قرار می گیرد .برای قطع ارتباط این خاصیت را TRUE کردن آن به set با
نشود ( موجود نبودن پورت ) با باز کردن پورت یک خطا رخ میدهد set درست comport میکنیم . اگر شماره ’ پورت در
که میتوان با چک کردن آن درستی عمل را تست نمود.
‘ Open the serial port
MSComm1.CommPort = 2
MSComm1.Settings = “9600,N,8,1”
MSComm1.PortOpen = True
قدم دوم : سازماندهی و تنظیمات مورد نیاز .
تنظیم بافرهای ورودی وخروجی : وقتی که شما یک پورت را باز میکنید دو بافر ورودی و خروجی ایجاد میشود این
وجود دارد . property بافرها نگهدارنده ’ اطلاعات ورودی وخروجی میباشند .برای سازماندهی این بافرها تعدادی
برای تعیین مقدار حافظه ’بافر برای ورودی و خروجی میباشد . افزایش مقدار Inbuffersize و Outbuffersize
این حافظه ها باعث احتمال کاهش حافظه برای برنامه میشود البته با وجود کامپیوترهای امروزی نیازی به نگرانی نیست
استفاده نمایید . hand shaiking میشود مگر اینکه از over flow .کاهش این مقدار نیز باعث بروز
-----------------------------------------------------------------------------------------
Rthershold , Sthershold
oncomm کردن و برگرداندن حداقل تعداد کاراکترهای قابل قبول در بافر خروجی قبل از رویداد set ’ وظیفه Sthershold
در oncomm را دارد مثلا ٠ کردن آن باعث غیر فعال شدن رویداد commevsend به مقدار commevnt و تغییر مقدار
برابر این مورد میشود و ١ کردن آن باعث رویدادن آن در زمان خالی شدن بافر میشود .برای توضیحات بیشتر به توضیحات
مراجعه نمائید . oncomm رویداد
و oncomm کردن و برگرداندن تعداد کاراکترهای موجود در بافر ورودی قبل از ایجاد رویداد set ’ وظیفه Rthershold
را دارد . commevrecive به مقدار commevnt تغییر مقدار
-----------------------------------------------------------------------------------------
Inputlen
میباشد. قرار دادن ٠ در آن باعث خواندن تمام محتویات بافر input کننده و برگرداننده طول رشته’ خوانده شده توسط Set
گیرنده میشود.
Eofenable
یک رویداد eof میباشد و با ١ کردن آن با رسیدن به (^Z - str$(٢٦)) end of file نشانگررسیدن به یک رشته
رخ خواهد داد. oncomm
اداره کردن بافرهای ورودی و خروجی
میتوانید بر property همانطور که گفته شد بافرهای ورودی و خروجی هنگام ایجاد یک پورت ایجاد میشود. شما با یکسری
دریافت کنید. text با binary رفتار این بافرها کنترل داشته باشید. شما میتوانید اطلاعات را به صورت
Input
این خاصیت برای ذخیره کردن و بازیابی اطلاعات درون بافر ورودی بکار میرود. مثلا اگر میخواهید اطلاعات رسیده را در یک
text١.text = mscomm١.input : نشان دهید text box
معین کنید . inputlen نکته : ابتدا بایستی طول رشته’ مورد نظر را با
Inputmode
دریافت کنید این کار را با استفاده از text با binary برای تعین فرمت ورودی بکار میرود شما میتوانید اطلاعات را به صورت
انجام پذیر است . در این صورت comminputmodebinary یا comminputmodetext به نامهای vb ثابتهای
و یا باینری در یک آرایه’ باینری ذخیره میشود . text اطلاعات به صورت
Inbuffercount
بیانگر تعداد بایتهای رسیده می باشد همچنین با صفر کردن آن بافر ورودی پاک میشود
بافر فرستنده ----------------------------
Output
را ارسال text با binary شما میتوانید input از این خاصیت برای ارسال اطلاعات یا دستورات استفاده نمود .مانند خاصیت
انجام دهید . text با binary کنید این کار را میتوانید با استفاده از تعریف مقادیر به صورت
مثال:
MSComm1.Output = "ATDT 111-111111" Send an AT command
MsComm1.Output = "This is a text string" Send a text string
MSComm1.Output = Out Send Byte array data
به بخش ارتباط با مودم مراجعه کنید . AT نکته : برای آشنائی با دستورات
Outbuffercount
شما همچنین میتوانید به تعداد کاراکترهای ارسالی از طریق این خاصیت پی ببرید .
-----------------------------------------------------------------------------------------
Hand Shaiking دستدهی
یک بخش مهم در سازماندهی بافرهای ورودی وخروجی اطمینان از صحت اطلاعات رسیده و اطلاعات ارسالی است و اطمینان
با استفاده ار بروتکل ارتباطی Hand Shaiking . نشده است (over flow) از اینکه سرعت در اطلاعات رسیده باعث سرریز
خود اطلاعات رسیده را بررسی میکنند تا در اثر سرریز از بین نرفته باشند .
(comnone) شما بایستی که پروتکل مورد نیاز را تعیین کنید. این پروتکل در حالت عادی غیر فعال است
Setting Value Description
ComNone 0 No handshaking (Default).
ComXOnXOff 1 XOn/XOff handshaking.
ComRTS 2 RTS/CTS (Request To Send/Clear To Send)
handshaking.
ComRTSXOnXOff 3 Both Request To Send and XOn/XOff handshaking.
هردو comRTSXOnXOff انتخاب پروتکلها بستگی زیادی به دستگاهی که میخواهید ب ه آن متصل شوید دارد با انتخاب
پروتکل حمایت میشوند
کنید وکر نه شما true را rtsenable کنید باید که خاصیت set نکته : اگر شما این خاصیت را به هر کدام از مقادیر ١ و ٢
قادر به دریافت اطلاعات نخواهید بود .
Rtsenable = [bolean]
استفاده شده و وجود این خاصیت به شما rtc/cts در دستدهی rts’ میگردد پایه rts’ شدن پایه high این خاصیت باعث
اجازه میدهد که به صورت دستی این کار را انجام دهید
Dsrholding .
است این سیگنال از طرف فرستنده برای اعلام آمادگی خود فرستاده میشود . dsr ’ تشخیص دهنده’ وضعیت پایه
Dtrenable
میشود low و با بسته شدن آن high با باز شدن پورت Dtr خط true کردن آن به set با
Setting Description
True Enable the Data Terminal Ready line.
False (Default) Disable the Data Terminal Ready line.
مودم میشویم . hangup نکته: در اکثر مواقع با ٠ کردن این خاصیت باعث
Ctsholding
این کار را انجام میدهد. این cts ’ این خاصیت تشخبص دهنده’ آمادگی برای ارسال اطلاعات میباشد که با چک کردن پایه
پایه ورودی است و ار طرف فرستنده ارسال میشود
Setting Description
True Clear To Send line high.
False Clear To Send line low.
Parityreplace ----------------------------------------------------
است. این کاراکتر در حالت معمول parity کننده و برگرداننده’کاراکتر جایگزین در هنگام رخداد خطای set این خلصیت
کنید ویا با مقدار دهی "" آنرا غیر فعال کنید . set برابر ؟ است ولی شما میتوانید به هر کاراکتر دیگر آنرا
Commevent و خاصیت Oncomm رخداد
و خاصیت Oncomm در هنگام اجرای برنامه شما بایستی به رویدادهای مختلف یا خطاهای ایجاد شده ت وجه نمایید رخداد
به شما اجازه ’ بدام انداختن و چک کردن رخدادها و خطاهای گوناگون را میدهد . در هنگام رخ دادن خطا Commevent
تغییر میکند. بنابراین شما میتوانید با تست این خاصیت commevent اجرا شده و مقدار خاصیت oncomm یک رویداد
متوجه عملکرد برنامه شوید
نشان میدهد . commevent . جدول زیر مقادیر خطاها در
Constant Value Description
ComEventBreak 1001 A Break signal was received.
ComEventFrame 1004 Framing Error. The hardware detected a framing error.
ComEventOverrun 1006 Port Overrun. A character was not read from the hardware
before the next character arrived and was lost.
ComEventRxOver 1008 Receive Buffer Overflow. There is no room in the receive
buffer.
ComEventRxParity 1009 Parity Error. The hardware detected a parity error.
ComEventTxFull 1010 Transmit Buffer Full. The transmit buffer was full while
trying to queue a character.
ComEventDCB 1011 Unexpected error retrieving Device Control Block (DCB)
for the port.
نشان میدهد . commevent جدول زیر مقادیر رویدادها را در
Constant Value Description
ComEvSend 1 There are fewer than Sthreshold number of characters in the
transmit buffer.
ComEvReceive 2 Received Rthreshold number of characters. This event is
generated continuously until you use the Input property to
remove the data from the receive buffer.
ComEvCTS 3 Change in Clear To Send line.
ComEvDSR 4 Change in Data Set Ready line. This event is only fired
when DSR changes from 1 to 0.
ComEvCD 5 Change in Carrier Detect line.
ComEvRing 6 Ring detected. Some UARTs (universal asynchronous
receiver-transmitters) may not support this event.
ComEvEOF 7 End Of File (ASCII character 26) character received.
میتوانید اطلاعات مفیدی در مورد اجرای برنامه کسب کنید. oncomm شما با تست این مقادیر در هنگام رویداد
ارتباط با مودم -------------------------
یکی از کاربردهای جالب پورت سریال استفاده از آن برای ارتباط با مودم میباشد مثلا میتوانید با آن شماره گیری کنید و یا
اطلاعات را از طریق خط تلفن ارسال و یا دریافت نمایید. مثلا برای شماره گیری با آن میتوانید از این دستور استفاده کرد.
MSComm1.Output = "ATDT 0571-2642332" & vbcr
شماره گیری به روش تن است . در حالت ارتبا ط با با یک T و dialing’ نشاندهنده D اغازگر ارتباط است AT در این مثال
است. ”ok“ شبکه بایستی از یک کاراکتر برگشتی نیز استفاده نمود .اگر شماره گیری درست انجام شود برگشتی تابع
به صورت زیر است . AT دیگر دستورات همراه
D ( dialing ) شماره گیری
T استفاده از سیستم تن
P استفاده از سیستم پالس
وقفه در شماره گیری ,
وقفه در شماره گیری به مقدار ٥. ثانیه !
H مودم میشود Hang up باعث
مثال : ارسال و دریافت یک فایل از طریق مودم
Dim Offset As Long : بخش فرستنده
Dim FileData As Byte
Dim FileName As String
Private Sub Form_Load()
MSComm1.Settings = "28800,N,8,1"
MSComm1.InputLen = 1
MSComm1.CommPort = 2
MSComm1.PortOpen = True
Offset = 1
Open FileName For Binary Access Read As #1
End Sub
Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = 2 Then
temp = MSComm1.Input
If Offset <= FileLen(FileName) Then
Get #1, Offset, FileData
q = FileData
MSComm1.Output = Format(q, "000")
Offset = Offset + 1
End If
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Close #1
End Sub
Dim ByteCount As Long : بخش گیرنده
Dim FileData As Byte
Private Sub Form_Load()
MSComm1.Settings = "28800,N,8,1"
MSComm1.InputLen = 3
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Open "c:\sample.txt" For Binary Access Write As #1
End Sub
Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = 2 And MSComm1.InBufferCount > 0 Then
FileData = CInt(MSComm1.Input)
ByteCount = ByteCount + 1
Put #1, ByteCount, FileData
MSComm1.Output = Chr$(26)
End If
End Sub
Private Sub Command1_Click()
MSComm1.Output = Chr$(26)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Close #1
End Sub
توضیح پایه های پورت سریال
9-pin 25-pin توضیح پایه نام پایه
3 2 TD
Transmit data ارسال کننده’ اطلالالالاعات
2 3 RD
Receive data گیرنده’ اطلالالالاعات
7 4 RTS
Request to send آماده برای ارسال
8 5 CTS
Clear to send آماده’ دریافت اطلالالالاعات
6 6 DSR
Data set ready گیرنده متصل شده و آماده است
5 7 GND
Signal ground زمین
4 20 DTR
Data terminal ready فرستنده آماده است
ارتباط میکروکنترلر و کامپیوتر از طریق پورت سریال .
با RS بایستی از یک رابط سخت افزاری برای تطابق سطح سیگنال ٢٣٢ RS برای ار تباط با میکرو از طریق پورت سریال ٢٣٢
استفاده DS و ی ا ٢٧٥ MAX یا ٢٣٣ MAX استفاده نمود برای این کار می توان از تراشه هایی مانند ٢٣٢ TTL سطح
بکار برد . RS نمود طرح ارائه شده در زیر را میتوان برای ارتباط میکرو با ٢٣٢
نمود DS مدار ارائه شده در زیر را نیز میتوان به راحتی جایگزین تراشه’ ٢٧٥
با کامل شدن ارتباط سخت افزاری میتوان شروع به ایجاد نرم افزار لازم نمود . برای ارتباط با پورت سریال کامپیوتر نیاز به
و دیگر تنظیمات لازم داریم که توسط میکرو و کامپیوتر حمایت شده باشد BOUD RATE تنظیم
.برای تنظیم این مقدار در کامپیوتر با توجه به توضیحات قبلی بایستی :
MSComm1.Settings = "9600,N,8,1"
نمود.. set را به مقدار دلخواه در میکرو و کامپیوتر Parity bit - Data bit - Stop bit البته میتوان مقادیر
برای تنظیمات لازم در میکرو کنترلر به مثال زیر توجه نمائید .
ORG 00
DB 1, 2 , 3, 4, 5, 0
ORG 100
MOV TMOD,#20H timer1 , mode 2 ( auto reload )
MOV TH1,#0FAH 4800 baud rate ( with xtall = 11.0592 mhz )
MOV SCON,#50H 8 bit , 1 stop , ren enable
SETB TR1 run timer 1
MOV DPTR,#00H load data pointer to transfer data
LL1:
CLR A
MOVC A,@A+DPTR load ACC with data
JZ LL2 test for 0 data ( end data )
CALL SEND call sender data function
INC DPTR inc data poniter
JMP LL1
SEND:
MOV SBUF,A load SBUF with data and send it
LL3:
JNB T1,LL3 wait for end send
RET
LL2:
END
--------------------------------------------------
مثال ارائه شده در بالا طرح ساده ای از ارسال چند عدد به کامپیوتر می باشد . همچنین شما میتوانید اطلاعات را به همین
صورت به میکرو منتقل نما ئید .
برای آشنا ئی بیشتر با ارتباط سریال در میکرو کنترلر می توانید به کتابهای موجود در این زمینه و یا أدرس اینجانب مراجعه
نمائید .
به امید سودمند بودن این مقاله و ارتقای روز افزون سطح تکنولوژی در کشورمان ایران .
سجاد صادقی
E_MAIL > sajad1995si@yahoo.com