Lập trình gửi dữ liệu qua serial com của pocket pc

25 Tháng hai 2008 lúc 10:56
#1
CÓ ai giải thích cho em biết sự khác nhau giữa EVC++ và VC++ ở những điểm nào không?
em muốn lập trình truyền dữ liệu qua cổng COM của pocket pc,hiện em có HP6365 em cũng tìm được các chân RX và TX của nó,em dùng EVC++4.0 nhưng em không tìm thấy thư viện hỗ trợ cho nó???
Em cũng chua từng lập trình trên VC++? có ai biết giải thích giúp em ?:):confused:
 

admin

Staff member
GÂY DỰNG
26 Tháng hai 2008 lúc 12:22
#2
EVC++ chỉ là IDE dành cho embedded trước đây của Microsoft. Bây giờ đã chuyển hết sang VS rồi. Nếu là VC++ 6.0 thì phải cài thêm phần mở rộng. Nếu dùng EVC thì cần cài thêm các SDK của PPC... mở cổng bằng hàm CreateFile(...), lâu quá rồi không nhớ chính xác.

Không biết có ai lập trình điều khiển không để giúp bạn thêm. Nhưng tôi nghĩ trong lúc chờ đợi, bạn có thể thử manual bằng cách mở các cổng 1...9 là tìm được cổng chính xác. Nếu
 
27 Tháng hai 2008 lúc 16:55
#3
Như vậy trong Visual Studio . Net đã có sẵn hết rồi phải không ah?
"mở các cổng 1...9 là tìm được cổng chính xác" là đủ sao? cổng của HP6365 có tất cả 22pin ? người ta định ngia CÓM...COM9 như nào vậy? các chân TX và RX nằm ở COM nào? có ai có tài liệu hay đọc ở đâu để hiểu rõ hơn ko nhỉ?
 

huuquynh

Staff member
NHẬP HỘI
5 Tháng ba 2008 lúc 23:20
#5
Tôi nghĩ bạn đã tìm ra 2 chân TX và RX rồi mà còn hỏi nằm ở COM nào thì chắc bà con ở đây đầu hàng hết. Không có cái gì là có sẵn cả... Vì thế nên mới phải mò xem nó ở cổng nào, và thế nên mới gợi ý mở các cổng 1...9 và gửi vài số liệu ra hoặc đọc vào các số liệu từ máy tính để bạn tự đo xem RX và TX có phản ứng gì không? Việc thử và mò này quá đơn giản đối với người lập trình embedded hoặc bậc thấp. Bạn không thử thì chẳng có ai giúp được gì đâu.

Tài liệu ư? Hỏi nhà cung cấp thiết bị!

:(
 
20 Tháng ba 2008 lúc 11:56
#6
//////////////////////////////////////////////////////////////////////

//Opening and Configuring Serial Ports
void CSerialPort::Open()
{
//Windows CE doesn't support overlapped I/O for devices, so you can't pass the FILE_FLAG_OVERLAPPED flag in the dwFlagsAndAttributes parameter
//The handle returned is either the handle to the opened serial port or INVALID_HANDLE_VALUE. Remember that, unlike many of the Windows functions,
//CreateFile doesn't return a 0 for a failed open.


m_PortHandle = CreateFile (TEXT ("COM1:"), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);

if (m_PortHandle != INVALID_HANDLE_VALUE)
{
AfxMessageBox(TEXT("Serial port could not be opened. Wrong port number?"), MB_OK);
m_PortHandle = NULL;
return; // error opening com port
}
else
//example turns off all flow control (such as XON/XOFF, CTS/RTS, and DSR/DTR) and sets the baud rate, data bits,
//and parity settings from the m_strBaud command string:
{
DCB dcb;
CString s;
dcb.DCBlength = sizeof(dcb);

// controlling the serial Port
//start a serial stream
SetCommState(m_PortHandle, &dcb);
//setting

dcb.BaudRate = CBR_115200;

dcb.Parity = EVENPARITY;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
//The fParity field can be set to TRUE to enable parity checking.
dcb.fParity = false;
//The fDsrSensitivity field is set to TRUE, and the serial port
//ignores any incoming bytes unless the port DSR line is enabled
dcb.fDsrSensitivity = false;
//The fOutxCtsFlow field should be set to TRUE if the output of the serial port should be
//controlled by the port CTS line
dcb.fOutxCtsFlow = true;
//The fOutxDsrFlow field should be set to TRUE if the output of the serial port should be
//controlled by the DSR line of the serial port
dcb.fOutxDsrFlow = false;
//Setting the fOutX field to TRUE specifies that the XON/XOFF control is used to control the serial output.
//Setting the fInX field to TRUE specifies that the XON/XOFF control is used for the input serial stream.
dcb.fInX = false;
dcb.fOutX = false;
//Setting the fTXContinueOnXoff field to TRUE tells the driver to stop transmitting characters if its receive
//buffer has reached its limit and the driver has transmitted an XOFF character
dcb.fTXContinueOnXoff = false;
//The fDtrControl field can be set to one of three values: DTR_CONTROL_DISABLE,
//which disables the DTR (Data Terminal Ready) line and leaves it disabled; DTR_CONTROL_ENABLE,
//which enables the DTR line; or DTR_CONTROL_HANDSHAKE, which tells the serial driver to toggle
//the DTR line in response to how much data is in the receive buffer.

dcb.fDtrControl = DTR_CONTROL_DISABLE; //DTR and RTS 0
dcb.fRtsControl = RTS_CONTROL_DISABLE;
//stop a serial stream
//parameter for both these functions is the handle to the opened COM port
//When SetCommBreak is called, the COM port stops transmitting characters
//and places the port in a break state. Communication is resumed with the ClearCommBreak function.
//dcb.XonChar = EV_RXFLAG;

dcb.fAbortOnError = false;
dcb.fNull = true; //tells the serial driver to discard null bytes received.

GetCommState(m_PortHandle, &dcb);
if (SetCommState(m_PortHandle, &dcb) == 0)
{
AfxMessageBox(TEXT("Serial port could not be initialized. Error while setting communication state."), MB_OK);
CloseHandle(m_PortHandle);
m_PortHandle = NULL;
return; // error opening com port
}


////////////////////////////////////////
// do tim xac dinh toc do truyen
//The configuration functions enable you to configure the serial driver, but with varied implementations
//of serial ports you need to know just what features a serial port supports before you configure it. The
//function GetCommProperties provides just this service
// GetCommProperties (m_PortHandle, LPCOMMPROP lpCommProp);


//Setting the Port Timeout Values
//ReadFile returns immediately regardless of whether there is data to be read.
//Set ReadIntervalTimeout to MAXDWORD. Set ReadTotalTimeoutMultiplier
//and ReadTotalTimeoutConstant to 0.
COMMTIMEOUTS touts;
touts.ReadIntervalTimeout = 100;
touts.ReadTotalTimeoutMultiplier = MAXDWORD;
touts.ReadTotalTimeoutConstant = 50;
touts.ReadIntervalTimeout =MAXDWORD;
touts.WriteTotalTimeoutConstant = 100;
touts.WriteTotalTimeoutMultiplier = 100;
//ReadFile doesn't have a timeout. The function doesn't return until the proper number
//of bytes is returned or an error occurs. Set ReadIntervalTimeout,
//ReadTotalTimeoutMultiplier, and ReadTotalTimeoutConstant to 0.
if (SetCommTimeouts(m_PortHandle, &touts)==0) //Set communication timeouts
{
AfxMessageBox(TEXT("Serial port could not be initialized. Error while setting communication timeouts."), MB_OK);
CloseHandle(m_PortHandle);
m_PortHandle = NULL;
return; // error opening com port
}

SetCommMask (m_PortHandle, EV_CTS | EV_DSR | EV_RING | EV_RLSD);

//Controlling the Serial Port
//You can stop and start a serial stream using the following functions
SetCommBreak(m_PortHandle);
ClearCommBreak(m_PortHandle);
//You can clear out any characters in either the transmit or receive queues internal to
//the serial driver using this function:
//Since Windows CE doesn't support overlapped I/O, the flags PURGE_TXABORT and PURGE_RXABORT,
//used under Windows NT and Windows 98, are ignored.
PurgeComm(m_PortHandle, PURGE_TXABORT | PURGE_RXABORT);


///Clearing Errors and Querying Status
// ClearCommError (m_PortHandle, CE_OVERRUN ,COMSTAT);
// return TRUE;
}
//else
// {
// return FALSE; // Use GetLastError() to know the reason
// }
}


// Dong cong

void CSerialPort::Close()
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
CloseHandle(m_PortHandle);
m_PortHandle = INVALID_HANDLE_VALUE;
}
}

//// Reading and Writing to a Serial Port

DWORD CSerialPort::Read(LPVOID Buffer, DWORD BufferSize)
{
INT rc;
DWORD Res(0);
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
rc = ReadFile(m_PortHandle, Buffer, BufferSize, &Res, NULL);

if ()
{
}
}
return Res;
}

DWORD CSerialPort::Write(LPVOID Buffer, DWORD BufferSize)
{
INT rc;
DWORD Res(0);
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
rc = WriteFile(m_PortHandle, Buffer, BufferSize, &Res, NULL);
}
return Res;
}

//The difference between TransmitCommChar and WriteFile is that TransmitCommChar puts
// the character to be transmitted at the front of the transmit queue. When you call WriteFile,
//the characters are queued up after any characters that haven't yet been transmitted by the serial
//driver. TransmitCommChar allows you to insert control characters quickly in the stream without
// having to wait for the queue to empty.

DWORD CSerialPort::Transmit(LPVOID Buffer, char cChar)
{
INT rc;
DWORD Res(0);
if (m_PortHandle!= INVALID_HANDLE_VALUE)
{
rc =TransmitCommChar(m_PortHandle,cChar);

}
return Res;
}
///////////////////////////////////////

Đây là mở cổng
VVậy bây giờ em muốn gửi dữ liẹu qua cổng như thế nào?? mong anh em nào dành chỉ giúp em???
 

Bài viết cần bạn xem thêm

I have owned multiple DS systems all the way up to the 3DS in 2012, as well as a few others like the PSP. I stopped playing a few years ago and would like to get back into things but I really don't know which direction to go in. The 3DS library certa ...
Lazada Vietnam Master card on Monday