シリアル ポートからの読み取りに winapi 関数を使用するこのプログラムがあります。
#include <string>
#include <Windows.h>
using std::cin;
using std::cout;
DCB blank_dcb = {0};
int main()
{
int ierr, jsu, jcs, jto, jrf, nt;
unsigned char readfile_chars[80];
DWORD nr;
std::string s;
HANDLE port_h;
COMMTIMEOUTS port_timeouts;
DCB dcb;
port_h = CreateFile("COM6", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(INVALID_HANDLE_VALUE == port_h)
{
cout << "Failed to open COM6.\n";
cout << "Press ENTER to exit.\n";
getline(cin, s);
return -1;
}
//
// Call SetupComm().
//
jsu = SetupComm(port_h, 1024, 1024);
if(0 == jsu)
{
cout << "Error while calling SetupComm(): ";
ierr = GetLastError();
cout << ierr << "\n";
cout << "Press ENTER to exit.\n";
getline(cin, s);
return -1;
}
//
// Set the comm state.
//
dcb = blank_dcb;
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;
dcb.fBinary = TRUE;
jcs = (int) SetCommState(port_h,&dcb);
if(0 == jcs)
{
cout << "Error while setting comm state.\n";
cout << "Press ENTER to exit.\n";
getline(cin, s);
return -1;
}
//
// Set the port's timeouts.
//
port_timeouts.ReadIntervalTimeout = MAXDWORD;
port_timeouts.ReadTotalTimeoutConstant = 0;
port_timeouts.ReadTotalTimeoutMultiplier = 0;
port_timeouts.WriteTotalTimeoutConstant = 0;
port_timeouts.WriteTotalTimeoutMultiplier = 0;
jto = SetCommTimeouts(port_h, &port_timeouts);
if(0 == jto)
{
cout << "Error setting comm timeouts.\n";
cout << "Press ENTER to exit.\n";
getline(cin, s);
return -1;
}
Sleep(5000);
nt = 9;
jrf = ReadFile(port_h, (LPVOID) &readfile_chars[0], nt, &nr, NULL);
if(0 == jrf)
{
cout << "ReadFile() failed.\n";
}
cout << "Read " << nr << " characters.\n";
readfile_chars[nr] = '\0';
cout << "Characters read: " << readfile_chars << "\n";
cout << "Press ENTER to exit.\n";
getline(cin, s);
return 1;
}
そして、Boost.Asio を使用するこのプログラム:
#include <iostream>
#include <string>
#define _WIN32_WINNT 0x0601
#include <boost/asio.hpp>
using std::cin;
using std::cout;
int main()
{
char message[80];
std::string s;
boost::asio::io_service io_svc;
boost::asio::serial_port com6(io_svc, "COM6");
com6.set_option(boost::asio::serial_port_base::baud_rate(9600));
com6.set_option(boost::asio::serial_port_base::character_size(8));
com6.set_option(boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one));
com6.set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none));
com6.set_option(boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::none));
boost::asio::read(com6, boost::asio::buffer(&message[0],9));
message[9] = '\0';
cout << "Characters received: " << message << "\n";
cout << "Press ENTER to exit.\n";
getline(cin, s);
}
RS232 ポート経由で ASCII 文字を送信するデジタル レベルがあります。
デジタル レベルは文字をパテ ウィンドウに正常に送信します。
ブースト プログラムは、シリアル ケーブルで COM6 に接続された外部 PC のハイパーターミナル ウィンドウから文字を正常に読み取ります。
ブースト プログラムは、デジタル レベルから正常に文字を読み取ります。
winapi プログラムは、外部 PC のハイパーターミナル ウィンドウから文字を正常に読み取ります。
winapi プログラムは、デジタル レベルから文字を読み取りません。関数 ReadFile() は、受信した文字数がゼロに設定されて正常に戻り、デジタル レベルがファイルの終わりにあると見なされることを示します。
winapi プログラムでは読み取れないのに、ブースト プログラムではデジタル レベルからの読み取りに成功するのはなぜですか?