2010-06-01 3 views
2

В моей .NET приложения мне нужно, чтобы достичь последовательного настройки порта эквивалент этой C++ управляемого кода:Настройка последовательных портов RS232; любой в C# альтернатива классу SerialPort?

::SetCommMask(m_hCOMM, EV_RXCHAR); 
::SetupComm(m_hCOMM, 9*2*128*10, 400); 
::PurgeComm(m_hCOMM, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); 

COMMTIMEOUTS timeOut; 
timeOut.ReadIntervalTimeout  = 3; 
timeOut.ReadTotalTimeoutConstant = 3; 
timeOut.ReadTotalTimeoutMultiplier = 1; 
timeOut.WriteTotalTimeoutConstant = 0; 
timeOut.WriteTotalTimeoutMultiplier= 0; 
int nRet= ::SetCommTimeouts(m_hCOMM, &timeOut); 

::EscapeCommFunction(m_hCOMM, SETDTR); 
::EscapeCommFunction(m_hCOMM, SETRTS);  

DCB dcb; 
memset(&dcb, 0, sizeof(DCB)); 
dcb.BaudRate= m_nSpeed; 
dcb.ByteSize= 8; 
dcb.fParity = FALSE; 
dcb.Parity = NOPARITY; 
dcb.StopBits= ONESTOPBIT; 
dcb.fBinary = TRUE; 


dcb.fDsrSensitivity= FALSE; 

dcb.fOutxDsrFlow= FALSE;   
dcb.fOutxCtsFlow= FALSE;    


dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; 
dcb.fRtsControl = RTS_CONTROL_TOGGLE; 

nRet= ::SetCommState(m_hCOMM, &dcb); 

Возможно ли это вообще? Как мне подойти к этой проблеме? Существуют ли какие-либо (предпочтительные бесплатные) библиотеки, которые разрешают такое управление последовательным портом низкого уровня, или я должен создать свою собственную оболочку поверх Win32 api? Кто-нибудь сделал что-то подобное или имеет идею, как «склеить» последовательный порт win32 с api с .net, чтобы я мог использовать аккуратные события .NET DataReceived()? Или, может быть, я могу создать экземпляр .NET SerialPort, а затем изменить его с помощью управляемого API?

+0

Класс SerialPort делает все, что делает ваш фрагмент кода. Не нужно изменять его. –

ответ

0

.NET SerialPort class имеет большую часть того, что вам нужно.

p = SerialPort.SerialPort(); //use whichever constructor you need 

p.DiscarInBuffer(); 
p.DiscardOutbuffer(); 
p.ReadBufferSize = 9*2*128*10; 
p.WriteBufferSize = 400; 


p.ReadTimeout = 10; //not exactly equivalent to COMMTIMEOUTS 
p.WriteTimeout = 0; 

p.DtrEnable = true; 
p.RtsEnable = true; 

p.BaudRate = m_nSpeed; 
p.DataBits = 8; 
p.Parity = Parity.None; 
p.StopBits = StopBits.One; 

//I think DSR and CTS states are pollable by app but ignored by driver 
+0

Is p.DtrEnable = true; p.RtsEnable = true; эквивалент: dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; dcb.fRtsControl = RTS_CONTROL_TOGGLE; ? Как насчет :: EscapeCommFunction (m_hCOMM, SETDTR); :: EscapeCommFunction (m_hCOMM, SETRTS); Спасибо за помощь! – adrin

+0

@adrin - Я думаю, что 'p.DtrEnable = true' эквивалентно' ':: EscapeCommFunction (m_hCOMM, SETDTR)', а также для RTS. Я не уверен, как установить handshaking в .NET, мне никогда не нужно было раньше. Извините, я не могу больше помочь. – mtrw