-
Notifications
You must be signed in to change notification settings - Fork 0
/
serial_communication_thread.h
95 lines (69 loc) · 3 KB
/
serial_communication_thread.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//! @file serial_communication_thread.h
// Copyright(c) 2023 Design Engineering Laboratory, Saitama University
// Released under the MIT license
// https://opensource.org/licenses/mit-license.php
#ifndef DESIGNLAB_SERIAL_COMMUNICATION_THREAD_H_
#define DESIGNLAB_SERIAL_COMMUNICATION_THREAD_H_
#include <string>
#include <vector>
#include <boost/thread.hpp>
#include <Windows.h> // シリアル通信を行うために必要.
namespace designlab
{
class SerialCommunicationThread final
{
public:
SerialCommunicationThread() = default;
~SerialCommunicationThread() = default;
void Loop();
//! @brief 指定した文字列をシリアル通信で送信する.
//! この時,排他制御を行う.
//! @param[in] str 送信する文字列.
void SetWriteData(const std::string& str);
//! @brief シリアル通信で受信した最新の文字列を取得する.
//! この時,排他制御を行う.
//! @return 受信した文字列.
std::string GetTopReadData() const;
//! @brief シリアル通信で受信した文字列を全て取得する.
//! この時,排他制御を行う.
//! @return 受信した文字列群.
std::vector<std::string> GetAllReadData() const;
//! @brief シリアル通信で受信した文字列の中から指定した数だけ取得する.
//! この時,排他制御を行う.
//! @param[in] num 取得する文字列の数.
//! @return 受信した文字列群.
std::vector<std::string> GetReadData(const int num) const;
//! @brief シリアル通信のスレッドを終了する.
void EndThread()
{
boost::mutex::scoped_lock lock(mutex_);
end_flag_ = true;
}
bool IsEnd() const
{
boost::mutex::scoped_lock lock(mutex_);
return end_flag_;
}
private:
static constexpr float kThreadPeriod = 0.01f; //!< シリアル通信スレッドの周期 [s]
static constexpr int kBufferSize = 1024; //!< シリアル通信のバッファサイズ [byte]
static constexpr int kComPortNumber = 3; //!< シリアル通信のポート番号.
//! @brief シリアル通信を開始する.
bool Initialize();
//! @brief シリアル通信のデータを受信する.
//! @retval true 受信成功.
//! @retval false 受信失敗.
bool Read();
//! @brief シリアル通信のデータを送信する.
//! @retval true 送信成功.
//! @retval false 送信失敗.
bool Write();
HANDLE serial_handle_{ INVALID_HANDLE_VALUE }; //!< シリアル通信のハンドル.
std::vector<std::string> read_data_; //!< シリアル通信で受信した文字列群.
std::string write_data_; //!< シリアル通信で送信する文字列.
bool end_flag_{ false }; //!< スレッド終了フラグ.
mutable boost::mutex mutex_; //!< 排他制御用のミューテックス.
};
} // namespace designlab
#endif // DESIGNLAB_SERIAL_COMMUNICATION_THREAD_H_