void ShowLastError(void)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
MessageBox( NULL,(char*) lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
};
HANDLE hCom;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString com=this->Edit1->Text;
AnsiString Succesful("\tóñïåøíî");
AnsiString Failed ("\tíå óñïåøíî");
DWORD T;
bool b;
_COMMTIMEOUTS ctmo;
COMMCONFIG cc;
DCB cdb;
DWORD size=sizeof(COMMCONFIG);
AnsiString str;
//îòêðûòèå ïîðòà
hCom=CreateFile(com.c_str(),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
cc.dwSize=size;
cc.wVersion=1;
cc.dwProviderSubType=PST_RS232;
cc.dwProviderOffset=0;
cc.dwProviderSize=0;
//ïðîâåðêà íà óñïåøíîå îòêðûòèå
if (hCom==INVALID_HANDLE_VALUE)
ShowLastError();
//÷òåíèå òåêóùèõ íàñòðîåê
if (!GetCommConfig(hCom,&cc,&size))
ShowLastError();
//âûâîä äèàëîãîâîãî îêíà ñ òåêóùèìè ïàðàìåòðàìè
if (!CommConfigDialog(this->Edit1->Text.c_str(),this->Handle,&cc))
ShowLastError();
//óñòàíîâêà íîâûõ ïàðàìåòðîâ
if (!SetCommConfig(hCom,&cc,size))
ShowLastError();
//íàñòðîéêà òàéìàóòîâ
ctmo.ReadIntervalTimeout=0;
ctmo.ReadTotalTimeoutMultiplier=0;
ctmo.ReadTotalTimeoutConstant=100;
ctmo.WriteTotalTimeoutMultiplier=0;
ctmo.WriteTotalTimeoutConstant=100;
//óñòàíîâêà òàéìàóòîâ
SetCommTimeouts(hCom,&ctmo);
//âêëþ÷åíèå òàéìåðà
this->Timer1->Enabled=true;
}
Параметры подключения к com-порту
Код:
Подскажите, пожалуйста, что здесь нужно дописать.
И еще один вопрос. Мне нужно отправить в порт такую строку:
{0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x03}
Я пробовал писать следующий код, но ничего не выходило :(
Код:
// Отправка
DWORD b;
unsigned char s = {0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x03};
//?????? ??????? ? ????
WriteFile(hCom,&s,1,&b,0);
DWORD b;
unsigned char s = {0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x03};
//?????? ??????? ? ????
WriteFile(hCom,&s,1,&b,0);
Код:
//Прием
char k;
DWORD b=0;
//÷òåíèå ñèìâîëà èç ïîðòà
ReadFile(hCom,&k,1,&b,0);
if (b)
{
//çàïèñü ñèìâîëà íà ýêðàí
this->Memo1->Text=this->Memo1->Text+AnsiString(k);
}
char k;
DWORD b=0;
//÷òåíèå ñèìâîëà èç ïîðòà
ReadFile(hCom,&k,1,&b,0);
if (b)
{
//çàïèñü ñèìâîëà íà ýêðàí
this->Memo1->Text=this->Memo1->Text+AnsiString(k);
}
The following example opens a handle to COM1 and fills in a DCB structure with the current configuration. The DCB structure is then modified and used to reconfigure the device.
DCB dcb;
HANDLE hCom;
DWORD dwError;
BOOL fSuccess;
hCom = CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0, /* comm devices must be opened w/exclusive-access */
NULL, /* no security attrs */
OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */
0, /* not overlapped I/O */
NULL /* hTemplate must be NULL for comm devices */
);
if (hCom == INVALID_HANDLE_VALUE) {
dwError = GetLastError();
/* handle error */
}
/*
* Omit the call to SetupComm to use the default queue sizes.
* Get the current configuration.
*/
fSuccess = GetCommState(hCom, &dcb);
if (!fSuccess) {
/* Handle the error. *
}
/* Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit. */
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess) {
/* Handle the error. *
}
а при отправке строки, в принципе все правильно, но unsigned char s - это не строка, это один байт! (или это опечатка?) надо unsigned char *s или unsigned char s[] = {}. тем более вертикальная палочка - это операция бинарное "или", поэтому то, что написано у тебя аналогично unsigned char s = 0x03, поэтому и получается не строка а один байт...
Огромное спасибо за ответ! Даже не знаю, как выразить всю свою благодарность!:)
да не за что! :)