簡體   English   中英

在Windows中將位寫入COM端口-等效於INPORTB函數

[英]Writing bits to COM port in Windows - equivalent to INPORTB function

我正在編寫程序來控制通過串行(RS-232)COM1端口連接的繼電器開關。 我正在使用的設備包含兩個繼電器開關。 這些是“打開”或“關閉”的。

默認情況下,兩個繼電器都是打開的。 通過設置調制解調器控制寄存器中的位1,可以關閉1號繼電器。 通過將調制解調器控制寄存器中的位0設置,可以關閉2號繼電器。

在C語言中,可以通過以下方式實現:

x = inportb(0x3FC);
x=x & ~2; //Set bit 1 to zero
x=x | 2;        //Set bit 1 to one
x=x & ~1; //Set bit 0 to zero
x=x | 1;        //Set bit 0 to one

但是,C ++並沒有使COM端口訪問變得如此容易(或者使我相信)。 我目前有以下代碼,可以成功打開和關閉COM端口,以便可以在C ++和Windows中進行通信:

#include <windows.h>

//Initialise Windows module
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
LPSTR lpszArgument, int nFunsterStil)

{
 //Define the serial port precedure
 HANDLE hSerial;

 //Initialise relay
 hSerial = CreateFile("COM1",GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

 //SOME CODE MUST GO HERE

 //Deactivate relay
 CloseHandle(hSerial);

 return 0;
}

但是,我對如何“設置位”不知所措。 我對C ++還是很陌生。 任何幫助將不勝感激。

您需要了解設備的工作方式。 您不能直接在hSerial中“設置位”。 打開COM端口后,您可以發送/接收字節。 可能您需要使用WriteFile (hSerial,...)將某些內容發送到設備。 也許您需要使用ReadFile (hSerial,...)從設備讀取信息。 COM端口不是在DOS中調用的端口,它不是地址或寄存器。 這是輸入/輸出流。 您可以使用COM端口,就像C程序可以使用STDIN和STDOUT一樣-從端口讀取和寫入信息。

一旦了解了設備的需求(這意味着定義通信協議 ),就可以在程序中實現它。 閱讀本文:串行通信http://msdn.microsoft.com/zh-cn/library/ff802693.aspx-Win32程序員需要了解有關串行通信的所有信息。

我假設您提供的C示例實際上不在Windows機器上,並且是從某些嵌入式平台上編寫的,對嗎? 看起來您可以直接訪問COM端口硬件。

並非如此的C ++帶來了更大的挑戰,而是Windows無法像您在嵌入式系統上那樣直接訪問硬件。 實際上,不可能通過標准Windows API設置COM端口上特定引腳的級別,您需要編寫一個具有增加的特權運行的驅動程序才能實現。 如果不編寫驅動程序,可能無法做您想做的事情,我不建議這樣做。

最好的解決方案是編寫嵌入式端,以接受命令作為通過RS-232發送的數據,而不是在特定引腳上查找電平。 Alex Farber的答案提供了一個很好的鏈接,可讓您開始使用Windows中的串行通信。

無法100%確定您在這里做什么或想要什么。 串行端口上的數據是串行的,您不能通過將數據發送到0x3FC上的UART tx緩沖區直接驅動繼電器。 自從W95 / 98 / ME / otherWintendo以來,這種特權(正如其他發布者所指出的那樣)具有訪問IO映射的特權。

可能有個好消息-如果您只需要驅動兩個(高靈敏度/低電流)繼電器,則可以利用RTS和DTR控制線來實現。 這些引腳提供的電流足以驅動12V線圈通孔。 一個二極管(線路從+12轉換為-12,因此您需要在普通的非極化繼電器上加上一個二極管,如果繼電器中還沒有二極管,則需要另一個二極管來鉗位開關過程中的任何反電動勢)。

可以從串行API驅動RTS / DTR,而無需任何特殊特權。

我現在正在執行此操作,以在測試嵌入式控制器時模擬流量傳感器開關。

請注意,不能以任何較大的速率切換繼電器-IO非常慢。 我可以在美好的一天得到15Hz左右的聲音。 4 * 4GHz內核,12GB RAM和我的PC只能以15Hz的頻率切換1位!

馬丁·羅格斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM