17static constexpr int kBaudRate = 9600;
20const std::string kComName[] = {
"",
"COM1",
"COM2",
"COM3",
"COM4",
21 "COM5",
"COM6",
"\\\\.\\COM7" ,
"COM8",
"COM9",
22 "\\\\.\\COM10",
"\\\\.\\COM11",
"\\\\.\\COM12",
"\\\\.\\COM13" };
36 Sleep(
static_cast<int>(1000 * kThreadPeriod));
63 if (serial_handle_ == INVALID_HANDLE_VALUE) {
68 boost::mutex::scoped_lock lock(mutex_);
75 boost::mutex::scoped_lock lock(mutex_);
78 if (read_data_.empty()) {
82 return read_data_.back();
87 boost::mutex::scoped_lock lock(mutex_);
94 boost::mutex::scoped_lock lock(mutex_);
96 std::vector<std::string> ret;
99 if (read_data_.empty()) {
104 if (read_data_.size() <= num) {
109 for (
int i = 0; i < num; ++i) {
110 ret.push_back(read_data_[read_data_.size() - 1 - i]);
116bool SerialCommunicationThread::Initialize() {
118 serial_handle_ = CreateFile(kComName[kComPortNumber].c_str(), GENERIC_READ | GENERIC_WRITE,
119 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
121 if (serial_handle_ == INVALID_HANDLE_VALUE) {
126 SetupComm(serial_handle_, kBufferSize, kBufferSize);
127 PurgeComm(serial_handle_, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
131 GetCommState(serial_handle_, &dcb);
138 dcb.BaudRate = kBaudRate;
140 SetCommState(serial_handle_, &dcb);
143 COMMTIMEOUTS timeouts;
144 GetCommTimeouts(serial_handle_, &timeouts);
146 timeouts.ReadIntervalTimeout = 100;
147 timeouts.ReadTotalTimeoutMultiplier = 100;
148 timeouts.ReadTotalTimeoutConstant = 100;
149 timeouts.WriteTotalTimeoutMultiplier = 0;
150 timeouts.WriteTotalTimeoutConstant = 0;
152 SetCommTimeouts(serial_handle_, &timeouts);
157bool SerialCommunicationThread::Read() {
159 if (serial_handle_ == INVALID_HANDLE_VALUE) {
164 char read_buffer[kBufferSize] = { 0 };
166 if (!ReadFile(serial_handle_, read_buffer, kBufferSize, &read_size, NULL)) {
171 if (read_size == 0) {
178 std::string read_data(read_buffer, read_size);
186 boost::mutex::scoped_lock lock(mutex_);
188 for (
const auto& data : split_data) {
195 read_data_.push_back(data);
202bool SerialCommunicationThread::Write() {
204 if (serial_handle_ == INVALID_HANDLE_VALUE) {
209 if (write_data_ ==
"") {
213 DWORD write_size = 0;
215 if (!WriteFile(serial_handle_, write_data_.c_str(),
static_cast<DWORD
>(write_data_.size()), &write_size, NULL)) {
220 if (write_size == 0) {
void SetWriteData(const std::string &str)
指定した文字列をシリアル通信で送信する. この時,排他制御を行う.
void EndThread()
シリアル通信のスレッドを終了する.
std::string GetTopReadData() const
シリアル通信で受信した最新の文字列を取得する. この時,排他制御を行う.
std::vector< std::string > GetAllReadData() const
シリアル通信で受信した文字列を全て取得する. この時,排他制御を行う.
std::vector< std::string > GetReadData(const int num) const
シリアル通信で受信した文字列の中から指定した数だけ取得する. この時,排他制御を行う.
std::vector< std::string > Split(const std::string &str, const std::string &separator)
文字列を分割する関数.指定した文字で文字列を分割する. 分割した結果,空白が含まれる場合や文字列がない場合は,そのまま返す. 最後が区切り文字で終わる場合は,それを無視する.