编写delphi串口类
<p>自己动手编写 delphi 的串口类</p><p> --date=2020-03-28</p>
<p> --group="笔记草稿"</p>
<p>---------</p>
<p>TODO 当前状态=玩具状态 --date=2020-05-24</p>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">unit</span><span style="color: rgba(0, 0, 0, 1)"> uSerialPort;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 串口
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 128, 0, 1)">---------
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 128, 0, 1)">NOTE
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 128, 0, 1)">从行为上来看, 这个串口类的读写貌似是阻塞的, 所以使用 Overlapped 有必要么,
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 128, 0, 1)">如果需要非阻塞的行为, 需要怎样组织呢
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 128, 0, 1)">没有对 C# 中的 Handshake 作处理, 所有注意到的与 Handshake 有关的地方都按None处理
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 128, 0, 1)">也有其他地方按默认值处理的, 但忘了有哪些了
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 128, 0, 1)">目前在端口 Open 状态时, 修改波特率什么的没效果, C# 中这些常用参数看上去是可以修改的
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 128, 0, 1)">还忽略了许多其他事情, 需要具体对比 C# 才知道还有哪些
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 128, 0, 1)">仅使用 USB-RS485 转换器测试收发了 10 几个字节,
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 128, 0, 1)">所以仅能在玩具程序中使用, 要想能够真正的使用还有很长的路
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 128, 0, 1)">---------
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 128, 0, 1)">TODO
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 128, 0, 1)">关于 GetLastError 返回的结果, 至少做一下说明, 不然单纯的数字根本不知道发生了什么
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 128, 0, 1)">---------
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 128, 0, 1)">Windows API 参考:
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 128, 0, 1)">https://docs.microsoft.com/zh-cn/windows/win32/devio/communications-resources
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 128, 0, 1)">https://docs.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-createfilea
</span><span style="color: rgba(0, 128, 128, 1)">22</span>
<span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 128, 0, 1)">关于 \\.\ 和 \\?\: https://docs.microsoft.com/zh-cn/windows/win32/fileio/naming-a-file
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 128, 0, 1)">Namespaces 节的 Win32 Device Namespaces
</span><span style="color: rgba(0, 128, 128, 1)">25</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 128, 0, 1)">同步和异步IO
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 128, 0, 1)">https://docs.microsoft.com/zh-cn/windows/win32/fileio/synchronous-and-asynchronous-i-o
</span><span style="color: rgba(0, 128, 128, 1)">28</span>
<span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 128, 0, 1)">学习串口工具的编写请参阅:
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 128, 0, 1)">https://github.com/dotnet/runtime/blob/master/src/libraries/System.IO.Ports/src/System/IO/Ports/SerialPort.cs
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 128, 0, 1)">https://github.com/dotnet/runtime/blob/master/src/libraries/System.IO.Ports/src/System/IO/Ports/SerialStream.Windows.cs
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 255, 1)">interface</span>
<span style="color: rgba(0, 128, 128, 1)">34</span>
<span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 0, 255, 1)">uses</span>
<span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 0, 0, 1)">System.Generics.Collections,
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 0, 1)">System.SysUtils,
</span><span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)">WinApi.Windows;
</span><span style="color: rgba(0, 128, 128, 1)">39</span>
<span style="color: rgba(0, 128, 128, 1)">40</span> <span style="color: rgba(0, 0, 255, 1)">type</span>
<span style="color: rgba(0, 128, 128, 1)">41</span> TSerialPort = <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 128, 128, 1)">42</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 串口</span>
<span style="color: rgba(0, 128, 128, 1)">43</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> @Section private type</span>
<span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(0, 0, 255, 1)">private</span>
<span style="color: rgba(0, 128, 128, 1)">45</span> <span style="color: rgba(0, 0, 255, 1)">type</span> TEventLoop = <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 128, 128, 1)">46</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 处理 WaitCommEvent</span>
<span style="color: rgba(0, 128, 128, 1)">47</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO 这个事件循环现在什么都没做, 有空再处理</span>
<span style="color: rgba(0, 128, 128, 1)">48</span> <span style="color: rgba(0, 0, 255, 1)">private</span>
<span style="color: rgba(0, 128, 128, 1)">49</span> <span style="color: rgba(0, 0, 0, 1)"> FHandle : THandle;
</span><span style="color: rgba(0, 128, 128, 1)">50</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(AHandle : THandle);
</span><span style="color: rgba(0, 128, 128, 1)">52</span> <span style="color: rgba(0, 0, 255, 1)">destructor</span> <span style="color: rgba(0, 0, 255, 1)">Destroy</span>; <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">53</span>
<span style="color: rgba(0, 128, 128, 1)">54</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Start();
</span><span style="color: rgba(0, 128, 128, 1)">55</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Stop();
</span><span style="color: rgba(0, 128, 128, 1)">56</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">57</span>
<span style="color: rgba(0, 128, 128, 1)">58</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> @Section public type</span>
<span style="color: rgba(0, 128, 128, 1)">59</span>
<span style="color: rgba(0, 128, 128, 1)">60</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> @Section public const</span>
<span style="color: rgba(0, 128, 128, 1)">61</span>
<span style="color: rgba(0, 128, 128, 1)">62</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> @Section private</span>
<span style="color: rgba(0, 128, 128, 1)">63</span> <span style="color: rgba(0, 0, 255, 1)">private</span>
<span style="color: rgba(0, 128, 128, 1)">64</span> FCommHandle : THandle; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 串口句柄</span>
<span style="color: rgba(0, 128, 128, 1)">65</span>
<span style="color: rgba(0, 128, 128, 1)">66</span> FCommName : String; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> COM口名称 COM1</span>
<span style="color: rgba(0, 128, 128, 1)">67</span> FBaudRate : Integer; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 波特率</span>
<span style="color: rgba(0, 128, 128, 1)">68</span> FParity : Integer; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 奇偶校验</span>
<span style="color: rgba(0, 128, 128, 1)">69</span> FDataBits : Integer; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据位</span>
<span style="color: rgba(0, 128, 128, 1)">70</span> FStopBit: Integer; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 停止位</span>
<span style="color: rgba(0, 128, 128, 1)">71</span>
<span style="color: rgba(0, 128, 128, 1)">72</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 超时, 毫秒, 取值范围, 如果设置为 0 表示不使用超时</span>
<span style="color: rgba(0, 128, 128, 1)">73</span> <span style="color: rgba(0, 0, 0, 1)"> FReadTimeOut : Integer;
</span><span style="color: rgba(0, 128, 128, 1)">74</span> <span style="color: rgba(0, 0, 0, 1)"> FWriteTimeOut : Integer;
</span><span style="color: rgba(0, 128, 128, 1)">75</span>
<span style="color: rgba(0, 128, 128, 1)">76</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 读写缓冲区大小</span>
<span style="color: rgba(0, 128, 128, 1)">77</span> <span style="color: rgba(0, 0, 0, 1)"> FReadBufferSize : Integer;
</span><span style="color: rgba(0, 128, 128, 1)">78</span> <span style="color: rgba(0, 0, 0, 1)"> FWriteBufferSize : Integer;
</span><span style="color: rgba(0, 128, 128, 1)">79</span>
<span style="color: rgba(0, 128, 128, 1)">80</span> <span style="color: rgba(0, 0, 0, 1)"> FParityReplace : AnsiChar;
</span><span style="color: rgba(0, 128, 128, 1)">81</span>
<span style="color: rgba(0, 128, 128, 1)">82</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO 考虑是否需要这些结构</span>
<span style="color: rgba(0, 128, 128, 1)">83</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> DCB TimeOuts 等结构</span>
<span style="color: rgba(0, 128, 128, 1)">84</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FDcb : TDCB;</span>
<span style="color: rgba(0, 128, 128, 1)">85</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> FTimeouts : TCommTimeouts;</span>
<span style="color: rgba(0, 128, 128, 1)">86</span>
<span style="color: rgba(0, 128, 128, 1)">87</span> <span style="color: rgba(0, 0, 0, 1)"> FEventLoop : TEventLoop;
</span><span style="color: rgba(0, 128, 128, 1)">88</span>
<span style="color: rgba(0, 128, 128, 1)">89</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> for property</span>
<span style="color: rgba(0, 128, 128, 1)">90</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropCommName(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ACommName : String);
</span><span style="color: rgba(0, 128, 128, 1)">91</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropBaudRate(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ABaudRate : Integer);
</span><span style="color: rgba(0, 128, 128, 1)">92</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropParity(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AParity : Integer);
</span><span style="color: rgba(0, 128, 128, 1)">93</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropDataBits(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ADataBits : Integer);
</span><span style="color: rgba(0, 128, 128, 1)">94</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropStopBit(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AStopBit : Integer);
</span><span style="color: rgba(0, 128, 128, 1)">95</span>
<span style="color: rgba(0, 128, 128, 1)">96</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropReadTimeOut(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ATimeOut : Integer);
</span><span style="color: rgba(0, 128, 128, 1)">97</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropWriteTimeOut(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ATimeOut : Integer);
</span><span style="color: rgba(0, 128, 128, 1)">98</span>
<span style="color: rgba(0, 128, 128, 1)">99</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropReadBufferSize(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ASize : Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 100</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPropWriteBufferSize(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ASize : Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 101</span>
<span style="color: rgba(0, 128, 128, 1)"> 102</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> about comm config</span>
<span style="color: rgba(0, 128, 128, 1)"> 103</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> ConfigEvents();
</span><span style="color: rgba(0, 128, 128, 1)"> 104</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> ConfigDCB(ACommProp : TCommProp);
</span><span style="color: rgba(0, 128, 128, 1)"> 105</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> ConfigTimeouts();
</span><span style="color: rgba(0, 128, 128, 1)"> 106</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> ConfigBufferSizes();
</span><span style="color: rgba(0, 128, 128, 1)"> 107</span>
<span style="color: rgba(0, 128, 128, 1)"> 108</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> about DCB.Flags</span>
<span style="color: rgba(0, 128, 128, 1)"> 109</span> <span style="color: rgba(0, 0, 255, 1)">function</span>GetDcbFlag(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ADcb : TDCB; AWhichFlag : Integer) : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 110</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> SetDcbFlag(<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> ADcb : TDCB; AWhichFlag : Integer; ASetting : Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 111</span>
<span style="color: rgba(0, 128, 128, 1)"> 112</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetHandleInvalid();
</span><span style="color: rgba(0, 128, 128, 1)"> 113</span> <span style="color: rgba(0, 0, 255, 1)">function</span>IsInvalidHandle(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AHandle : THandle) : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)"> 114</span>
<span style="color: rgba(0, 128, 128, 1)"> 115</span> <span style="color: rgba(0, 0, 255, 1)">function</span> CheckAndGetComNumber(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AComName : String) : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 116</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> CheckReadWriteArguments(<span style="color: rgba(0, 0, 255, 1)">const</span> AArr : TArray<Byte>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AOffset, ACount : Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 117</span>
<span style="color: rgba(0, 128, 128, 1)"> 118</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> @Section public</span>
<span style="color: rgba(0, 128, 128, 1)"> 119</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 120</span> <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(); <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 121</span> <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(0, 0, 255, 1)">const</span> AComName : String); <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 122</span> <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AComName : String;
</span><span style="color: rgba(0, 128, 128, 1)"> 123</span> <span style="color: rgba(0, 0, 255, 1)">const</span> ABaudRate, AParity, ADataBits, AStopBit : Integer); <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 124</span>
<span style="color: rgba(0, 128, 128, 1)"> 125</span> <span style="color: rgba(0, 0, 255, 1)">destructor</span> <span style="color: rgba(0, 0, 255, 1)">Destroy</span>(); <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 126</span>
<span style="color: rgba(0, 128, 128, 1)"> 127</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> IsOpen() : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)"> 128</span>
<span style="color: rgba(0, 128, 128, 1)"> 129</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Open();
</span><span style="color: rgba(0, 128, 128, 1)"> 130</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Close();
</span><span style="color: rgba(0, 128, 128, 1)"> 131</span>
<span style="color: rgba(0, 128, 128, 1)"> 132</span> <span style="color: rgba(0, 0, 255, 1)">function</span>ReadBytes(ABuff : TArray<Byte>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AOffset, ACount : Integer) : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 133</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> WriteBytes(ABuff : TArray<Byte>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AOffset, ACount : Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 134</span>
<span style="color: rgba(0, 128, 128, 1)"> 135</span> <span style="color: rgba(0, 0, 255, 1)">property</span> PortName : String <span style="color: rgba(0, 0, 255, 1)">read</span> FCommName <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropCommName;
</span><span style="color: rgba(0, 128, 128, 1)"> 136</span> <span style="color: rgba(0, 0, 255, 1)">property</span> BaudRate : Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FBaudRate <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropBaudRate;
</span><span style="color: rgba(0, 128, 128, 1)"> 137</span> <span style="color: rgba(0, 0, 255, 1)">property</span> Parity : Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FParity <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropParity;
</span><span style="color: rgba(0, 128, 128, 1)"> 138</span> <span style="color: rgba(0, 0, 255, 1)">property</span> DataBits : Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FDataBits <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropDataBits;
</span><span style="color: rgba(0, 128, 128, 1)"> 139</span> <span style="color: rgba(0, 0, 255, 1)">property</span> StopBit : Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FStopBit <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropStopBit;
</span><span style="color: rgba(0, 128, 128, 1)"> 140</span>
<span style="color: rgba(0, 128, 128, 1)"> 141</span> <span style="color: rgba(0, 0, 255, 1)">property</span> ReadTimeOut : Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FReadTimeOut <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropReadTimeOut;
</span><span style="color: rgba(0, 128, 128, 1)"> 142</span> <span style="color: rgba(0, 0, 255, 1)">property</span> WriteTimeOut : Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FWriteTimeOut <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropWriteTimeOut;
</span><span style="color: rgba(0, 128, 128, 1)"> 143</span>
<span style="color: rgba(0, 128, 128, 1)"> 144</span> <span style="color: rgba(0, 0, 255, 1)">property</span> ReadBufferSize : Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FReadBufferSize <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropReadBufferSize;
</span><span style="color: rgba(0, 128, 128, 1)"> 145</span> <span style="color: rgba(0, 0, 255, 1)">property</span> WriteBufferSize : Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FWriteBufferSize <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetPropWriteBufferSize;
</span><span style="color: rgba(0, 128, 128, 1)"> 146</span>
<span style="color: rgba(0, 128, 128, 1)"> 147</span> <span style="color: rgba(0, 0, 255, 1)">property</span> ParityReplace : AnsiChar <span style="color: rgba(0, 0, 255, 1)">read</span> FParityReplace <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> FParityReplace;
</span><span style="color: rgba(0, 128, 128, 1)"> 148</span>
<span style="color: rgba(0, 128, 128, 1)"> 149</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> @Section public class</span>
<span style="color: rgba(0, 128, 128, 1)"> 150</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 151</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> GetPortNames() : TArray<String><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 152</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 153</span>
<span style="color: rgba(0, 128, 128, 1)"> 154</span>
<span style="color: rgba(0, 128, 128, 1)"> 155</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 串口异常</span>
<span style="color: rgba(0, 128, 128, 1)"> 156</span> ESerialPort = <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(Exception);
</span><span style="color: rgba(0, 128, 128, 1)"> 157</span>
<span style="color: rgba(0, 128, 128, 1)"> 158</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 串口读或写超时</span>
<span style="color: rgba(0, 128, 128, 1)"> 159</span> ESerialPortTimeOut = <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(ESerialPort);
</span><span style="color: rgba(0, 128, 128, 1)"> 160</span>
<span style="color: rgba(0, 128, 128, 1)"> 161</span>
<span style="color: rgba(0, 128, 128, 1)"> 162</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 别名, 辅助用</span>
<span style="color: rgba(0, 128, 128, 1)"> 163</span> TBaudRateTool = <span style="color: rgba(0, 0, 255, 1)">record</span>
<span style="color: rgba(0, 128, 128, 1)"> 164</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">const</span>
<span style="color: rgba(0, 128, 128, 1)"> 165</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> aliases</span>
<span style="color: rgba(0, 128, 128, 1)"> 166</span> BR_<span style="color: rgba(128, 0, 128, 1)">110</span>= CBR_<span style="color: rgba(128, 0, 128, 1)">110</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 167</span> BR_<span style="color: rgba(128, 0, 128, 1)">300</span>= CBR_<span style="color: rgba(128, 0, 128, 1)">300</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 168</span> BR_<span style="color: rgba(128, 0, 128, 1)">600</span>= CBR_<span style="color: rgba(128, 0, 128, 1)">600</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 169</span> BR_<span style="color: rgba(128, 0, 128, 1)">1200</span> = CBR_<span style="color: rgba(128, 0, 128, 1)">1200</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 170</span> BR_<span style="color: rgba(128, 0, 128, 1)">2400</span> = CBR_<span style="color: rgba(128, 0, 128, 1)">2400</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 171</span> BR_<span style="color: rgba(128, 0, 128, 1)">4800</span> = CBR_<span style="color: rgba(128, 0, 128, 1)">4800</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 172</span> BR_<span style="color: rgba(128, 0, 128, 1)">9600</span> = CBR_<span style="color: rgba(128, 0, 128, 1)">9600</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 173</span> BR_<span style="color: rgba(128, 0, 128, 1)">14400</span>= CBR_<span style="color: rgba(128, 0, 128, 1)">14400</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 174</span> BR_<span style="color: rgba(128, 0, 128, 1)">19200</span>= CBR_<span style="color: rgba(128, 0, 128, 1)">19200</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 175</span> BR_<span style="color: rgba(128, 0, 128, 1)">38400</span>= CBR_<span style="color: rgba(128, 0, 128, 1)">38400</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 176</span> BR_<span style="color: rgba(128, 0, 128, 1)">56000</span>= CBR_<span style="color: rgba(128, 0, 128, 1)">56000</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 177</span> BR_<span style="color: rgba(128, 0, 128, 1)">57600</span>= CBR_<span style="color: rgba(128, 0, 128, 1)">57600</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 178</span> BR_<span style="color: rgba(128, 0, 128, 1)">115200</span> = CBR_<span style="color: rgba(128, 0, 128, 1)">115200</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 179</span> BR_<span style="color: rgba(128, 0, 128, 1)">128000</span> = CBR_<span style="color: rgba(128, 0, 128, 1)">128000</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 180</span> BR_<span style="color: rgba(128, 0, 128, 1)">256000</span> = CBR_<span style="color: rgba(128, 0, 128, 1)">256000</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 181</span>
<span style="color: rgba(0, 128, 128, 1)"> 182</span> SupportedValues : <span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">14</span>] <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Integer
</span><span style="color: rgba(0, 128, 128, 1)"> 183</span> = (BR_<span style="color: rgba(128, 0, 128, 1)">110</span>, BR_<span style="color: rgba(128, 0, 128, 1)">300</span>, BR_<span style="color: rgba(128, 0, 128, 1)">600</span>, BR_<span style="color: rgba(128, 0, 128, 1)">1200</span>, BR_<span style="color: rgba(128, 0, 128, 1)">2400</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 184</span> BR_<span style="color: rgba(128, 0, 128, 1)">4800</span>,BR_<span style="color: rgba(128, 0, 128, 1)">9600</span>,BR_<span style="color: rgba(128, 0, 128, 1)">14400</span>,BR_<span style="color: rgba(128, 0, 128, 1)">19200</span>,BR_<span style="color: rgba(128, 0, 128, 1)">38400</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 185</span> BR_<span style="color: rgba(128, 0, 128, 1)">56000</span>, BR_<span style="color: rgba(128, 0, 128, 1)">57600</span>, BR_<span style="color: rgba(128, 0, 128, 1)">115200</span>, BR_<span style="color: rgba(128, 0, 128, 1)">128000</span>, BR_<span style="color: rgba(128, 0, 128, 1)">256000</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 186</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 187</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> IsSupportedBaudRate(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ABaudRate : Integer) : Boolean; static;
</span><span style="color: rgba(0, 128, 128, 1)"> 188</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 189</span>
<span style="color: rgba(0, 128, 128, 1)"> 190</span> TParityTool = <span style="color: rgba(0, 0, 255, 1)">record</span>
<span style="color: rgba(0, 128, 128, 1)"> 191</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">const</span>
<span style="color: rgba(0, 128, 128, 1)"> 192</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> aliases</span>
<span style="color: rgba(0, 128, 128, 1)"> 193</span> None = NOPARITY; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 无校验</span>
<span style="color: rgba(0, 128, 128, 1)"> 194</span> Odd= ODDPARITY;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 奇校验</span>
<span style="color: rgba(0, 128, 128, 1)"> 195</span> Even = EVENPARITY; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 偶校验</span>
<span style="color: rgba(0, 128, 128, 1)"> 196</span>
<span style="color: rgba(0, 128, 128, 1)"> 197</span> SupportedValues : <span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">2</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer =<span style="color: rgba(0, 0, 0, 1)"> (None, Odd, Even);
</span><span style="color: rgba(0, 128, 128, 1)"> 198</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 199</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> IsSupportedParity(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AParity : Integer) : Boolean; static;
</span><span style="color: rgba(0, 128, 128, 1)"> 200</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 201</span>
<span style="color: rgba(0, 128, 128, 1)"> 202</span> TDataBitsTool = <span style="color: rgba(0, 0, 255, 1)">record</span>
<span style="color: rgba(0, 128, 128, 1)"> 203</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">const</span>
<span style="color: rgba(0, 128, 128, 1)"> 204</span> SupportedValues : <span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">3</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = (<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 205</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 206</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> IsSupportedDataBits(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ADataBits : Integer) : Boolean; static;
</span><span style="color: rgba(0, 128, 128, 1)"> 207</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 208</span>
<span style="color: rgba(0, 128, 128, 1)"> 209</span> TStopBitTool = <span style="color: rgba(0, 0, 255, 1)">record</span>
<span style="color: rgba(0, 128, 128, 1)"> 210</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">const</span>
<span style="color: rgba(0, 128, 128, 1)"> 211</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> aliases</span>
<span style="color: rgba(0, 128, 128, 1)"> 212</span> One= ONESTOPBIT; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1</span>
<span style="color: rgba(0, 128, 128, 1)"> 213</span> One5 = ONE5STOPBITS;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1.5</span>
<span style="color: rgba(0, 128, 128, 1)"> 214</span> Two= TWOSTOPBITS; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 215</span>
<span style="color: rgba(0, 128, 128, 1)"> 216</span> SupportedValues : <span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">2</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer =<span style="color: rgba(0, 0, 0, 1)"> (One, One5, Two);
</span><span style="color: rgba(0, 128, 128, 1)"> 217</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 218</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> IsSupportedStopBit(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AStopBit : Integer) : Boolean; static;
</span><span style="color: rgba(0, 128, 128, 1)"> 219</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 220</span>
<span style="color: rgba(0, 128, 128, 1)"> 221</span>
<span style="color: rgba(0, 128, 128, 1)"> 222</span> <span style="color: rgba(0, 0, 255, 1)">implementation</span>
<span style="color: rgba(0, 128, 128, 1)"> 223</span>
<span style="color: rgba(0, 128, 128, 1)"> 224</span> <span style="color: rgba(0, 0, 255, 1)">uses</span>
<span style="color: rgba(0, 128, 128, 1)"> 225</span> <span style="color: rgba(0, 0, 0, 1)">System.Classes,
</span><span style="color: rgba(0, 128, 128, 1)"> 226</span> <span style="color: rgba(0, 0, 0, 1)">System.Math,
</span><span style="color: rgba(0, 128, 128, 1)"> 227</span> <span style="color: rgba(0, 0, 0, 1)">System.Win.Registry;
</span><span style="color: rgba(0, 128, 128, 1)"> 228</span>
<span style="color: rgba(0, 128, 128, 1)"> 229</span>
<span style="color: rgba(0, 128, 128, 1)"> 230</span>
<span style="color: rgba(0, 128, 128, 1)"> 231</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- types from C# ---</span>
<span style="color: rgba(0, 128, 128, 1)"> 232</span>
<span style="color: rgba(0, 128, 128, 1)"> 233</span> <span style="color: rgba(0, 0, 255, 1)">type</span>
<span style="color: rgba(0, 128, 128, 1)"> 234</span> DCBFlags = <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 128, 128, 1)"> 235</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 没仔细看, 想来应该是偏移量</span>
<span style="color: rgba(0, 128, 128, 1)"> 236</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --see-also=https://github.com/dotnet/runtime/blob/master/src/libraries/Common/src/Interop/Windows/Kernel32/Interop.DCB.cs</span>
<span style="color: rgba(0, 128, 128, 1)"> 237</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 238</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FBINARY = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 239</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FPARITY = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 240</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FOUTXCTSFLOW = <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 241</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FOUTXDSRFLOW = <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 242</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FDTRCONTROL= <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 243</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FDSRSENSITIVITY = <span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 244</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FOUTX = <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 245</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FINX= <span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 246</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FERRORCHAR = <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 247</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FNULL = <span style="color: rgba(128, 0, 128, 1)">11</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 248</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FRTSCONTROL = <span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 249</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FABORTONOERROR = <span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 250</span> <span style="color: rgba(0, 0, 255, 1)">const</span> FDUMMY2 = <span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 251</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 252</span>
<span style="color: rgba(0, 128, 128, 1)"> 253</span> DCBDTRFlowControl = <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 128, 128, 1)"> 254</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 255</span> <span style="color: rgba(0, 0, 255, 1)">const</span> DTR_CONTROL_DISABLE = $<span style="color: rgba(128, 0, 128, 1)">00</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 256</span> <span style="color: rgba(0, 0, 255, 1)">const</span> DTR_CONTROL_ENABLE= $<span style="color: rgba(128, 0, 128, 1)">01</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 257</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 258</span>
<span style="color: rgba(0, 128, 128, 1)"> 259</span> DCBRTSFlowControl = <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 128, 128, 1)"> 260</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 261</span> <span style="color: rgba(0, 0, 255, 1)">const</span> RTS_CONTROL_DISABLE = $<span style="color: rgba(128, 0, 128, 1)">00</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 262</span> <span style="color: rgba(0, 0, 255, 1)">const</span> RTS_CONTROL_ENABLE = $<span style="color: rgba(128, 0, 128, 1)">01</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 263</span> <span style="color: rgba(0, 0, 255, 1)">const</span> RTS_CONTROL_HANDSHAKE = $<span style="color: rgba(128, 0, 128, 1)">02</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 264</span> <span style="color: rgba(0, 0, 255, 1)">const</span> RTS_CONTROL_TOGGLE = $<span style="color: rgba(128, 0, 128, 1)">03</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 265</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 266</span>
<span style="color: rgba(0, 128, 128, 1)"> 267</span> TDCBTool = <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 128, 128, 1)"> 268</span> <span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 128, 128, 1)"> 269</span> <span style="color: rgba(0, 0, 255, 1)">const</span> EOFCHAR = AnsiChar(<span style="color: rgba(128, 0, 128, 1)">26</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 270</span>
<span style="color: rgba(0, 128, 128, 1)"> 271</span> <span style="color: rgba(0, 0, 255, 1)">const</span> DEFAULTXONCHAR= AnsiChar(<span style="color: rgba(128, 0, 128, 1)">17</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 272</span> <span style="color: rgba(0, 0, 255, 1)">const</span> DEFAULTXOFFCHAR = AnsiChar(<span style="color: rgba(128, 0, 128, 1)">19</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 273</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 274</span>
<span style="color: rgba(0, 128, 128, 1)"> 275</span>
<span style="color: rgba(0, 128, 128, 1)"> 276</span>
<span style="color: rgba(0, 128, 128, 1)"> 277</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- TSerialPort ---</span>
<span style="color: rgba(0, 128, 128, 1)"> 278</span>
<span style="color: rgba(0, 128, 128, 1)"> 279</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- class functions</span>
<span style="color: rgba(0, 128, 128, 1)"> 280</span>
<span style="color: rgba(0, 128, 128, 1)"> 281</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TSerialPort.GetPortNames() : TArray<String><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 282</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取当前计算机的串行端口名的数组</span>
<span style="color: rgba(0, 128, 128, 1)"> 283</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 284</span> <span style="color: rgba(0, 0, 0, 1)">LRegistry : TRegistry;
</span><span style="color: rgba(0, 128, 128, 1)"> 285</span> LValNames : TStrings;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 注册表键下值的名称</span>
<span style="color: rgba(0, 128, 128, 1)"> 286</span> <span style="color: rgba(0, 0, 0, 1)">LIndex : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 287</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 288</span> LRegistry := <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 289</span> LValNames := <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 290</span> <span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 128, 1)"> 291</span> LValNames := TStringList.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 292</span> LRegistry := TRegistry.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 293</span>
<span style="color: rgba(0, 128, 128, 1)"> 294</span> LRegistry.RootKey :=<span style="color: rgba(0, 0, 0, 1)"> HKEY_LOCAL_MACHINE;
</span><span style="color: rgba(0, 128, 128, 1)"> 295</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> LRegistry.OpenKeyReadOnly(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">HARDWARE\DEVICEMAP\SERIALCOMM</span><span style="color: rgba(128, 0, 0, 1)">'</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 128, 128, 1)"> 296</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 297</span> Result := <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 298</span> <span style="color: rgba(0, 0, 0, 1)"> Exit;
</span><span style="color: rgba(0, 128, 128, 1)"> 299</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 300</span>
<span style="color: rgba(0, 128, 128, 1)"> 301</span> <span style="color: rgba(0, 0, 0, 1)"> LRegistry.GetValueNames(LValNames);
</span><span style="color: rgba(0, 128, 128, 1)"> 302</span>
<span style="color: rgba(0, 128, 128, 1)"> 303</span> <span style="color: rgba(0, 0, 0, 1)"> SetLength(Result, LValNames.Count);
</span><span style="color: rgba(0, 128, 128, 1)"> 304</span>
<span style="color: rgba(0, 128, 128, 1)"> 305</span> <span style="color: rgba(0, 0, 255, 1)">for</span> LIndex := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> (LValNames.Count - <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">do</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 306</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> LRegistry.ReadString(LValNames);
</span><span style="color: rgba(0, 128, 128, 1)"> 307</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 308</span> <span style="color: rgba(0, 0, 255, 1)">finally</span>
<span style="color: rgba(0, 128, 128, 1)"> 309</span> <span style="color: rgba(0, 0, 255, 1)">FreeAndNil</span><span style="color: rgba(0, 0, 0, 1)">(LRegistry);
</span><span style="color: rgba(0, 128, 128, 1)"> 310</span> <span style="color: rgba(0, 0, 255, 1)">FreeAndNil</span><span style="color: rgba(0, 0, 0, 1)">(LValNames);
</span><span style="color: rgba(0, 128, 128, 1)"> 311</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 312</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 313</span>
<span style="color: rgba(0, 128, 128, 1)"> 314</span>
<span style="color: rgba(0, 128, 128, 1)"> 315</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- functions</span>
<span style="color: rgba(0, 128, 128, 1)"> 316</span>
<span style="color: rgba(0, 128, 128, 1)"> 317</span> <span style="color: rgba(0, 0, 255, 1)">constructor</span> TSerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 318</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 319</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">COM1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 320</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 321</span>
<span style="color: rgba(0, 128, 128, 1)"> 322</span> <span style="color: rgba(0, 0, 255, 1)">constructor</span> TSerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(0, 0, 255, 1)">const</span> AComName: <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 323</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认 9600波特率 无校验 8数据位 1停止位</span>
<span style="color: rgba(0, 128, 128, 1)"> 324</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 325</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(AComName, CBR_<span style="color: rgba(128, 0, 128, 1)">9600</span>, NOPARITY, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">, ONESTOPBIT);
</span><span style="color: rgba(0, 128, 128, 1)"> 326</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 327</span>
<span style="color: rgba(0, 128, 128, 1)"> 328</span> <span style="color: rgba(0, 0, 255, 1)">constructor</span> TSerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(0, 0, 255, 1)">const</span> AComName: <span style="color: rgba(0, 0, 255, 1)">string</span>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ABaudRate, AParity, ADataBits, AStopBit: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 329</span> <span style="color: rgba(0, 0, 255, 1)">const</span>
<span style="color: rgba(0, 128, 128, 1)"> 330</span> LDefaultBufferSize = <span style="color: rgba(128, 0, 128, 1)">2048</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 331</span> LDefaultParityReplace = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">?</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 332</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 333</span> <span style="color: rgba(0, 0, 255, 1)">inherited</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 334</span>
<span style="color: rgba(0, 128, 128, 1)"> 335</span> <span style="color: rgba(0, 0, 0, 1)">self.SetHandleInvalid();
</span><span style="color: rgba(0, 128, 128, 1)"> 336</span>
<span style="color: rgba(0, 128, 128, 1)"> 337</span> self.FEventLoop := <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 338</span>
<span style="color: rgba(0, 128, 128, 1)"> 339</span> self.FReadBufferSize:=<span style="color: rgba(0, 0, 0, 1)"> LDefaultBufferSize;
</span><span style="color: rgba(0, 128, 128, 1)"> 340</span> self.FWriteBufferSize :=<span style="color: rgba(0, 0, 0, 1)"> LDefaultBufferSize;
</span><span style="color: rgba(0, 128, 128, 1)"> 341</span>
<span style="color: rgba(0, 128, 128, 1)"> 342</span> self.FReadTimeOut:= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 343</span> self.FWriteTimeOut := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 344</span>
<span style="color: rgba(0, 128, 128, 1)"> 345</span> self.FParityReplace :=<span style="color: rgba(0, 0, 0, 1)"> LDefaultParityReplace;
</span><span style="color: rgba(0, 128, 128, 1)"> 346</span>
<span style="color: rgba(0, 128, 128, 1)"> 347</span> <span style="color: rgba(0, 0, 0, 1)">self.SetPropCommName(AComName);
</span><span style="color: rgba(0, 128, 128, 1)"> 348</span> <span style="color: rgba(0, 0, 0, 1)">self.SetPropBaudRate(ABaudRate);
</span><span style="color: rgba(0, 128, 128, 1)"> 349</span> <span style="color: rgba(0, 0, 0, 1)">self.SetPropParity(AParity);
</span><span style="color: rgba(0, 128, 128, 1)"> 350</span> <span style="color: rgba(0, 0, 0, 1)">self.SetPropDataBits(ADataBits);
</span><span style="color: rgba(0, 128, 128, 1)"> 351</span> <span style="color: rgba(0, 0, 0, 1)">self.SetPropStopBit(AStopBit);
</span><span style="color: rgba(0, 128, 128, 1)"> 352</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 353</span>
<span style="color: rgba(0, 128, 128, 1)"> 354</span>
<span style="color: rgba(0, 128, 128, 1)"> 355</span> <span style="color: rgba(0, 0, 255, 1)">destructor</span> TSerialPort.<span style="color: rgba(0, 0, 255, 1)">Destroy</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 356</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 357</span> <span style="color: rgba(0, 0, 255, 1)">if</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 358</span> <span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 128, 1)"> 359</span> <span style="color: rgba(0, 0, 0, 1)"> self.Close();
</span><span style="color: rgba(0, 128, 128, 1)"> 360</span> <span style="color: rgba(0, 0, 255, 1)">except</span>
<span style="color: rgba(0, 128, 128, 1)"> 361</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果执行到了这里, 能做什么呢</span>
<span style="color: rgba(0, 128, 128, 1)"> 362</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 363</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 364</span>
<span style="color: rgba(0, 128, 128, 1)"> 365</span> <span style="color: rgba(0, 0, 255, 1)">inherited</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 366</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 367</span>
<span style="color: rgba(0, 128, 128, 1)"> 368</span>
<span style="color: rgba(0, 128, 128, 1)"> 369</span>
<span style="color: rgba(0, 128, 128, 1)"> 370</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.IsOpen() : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)"> 371</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 判断端口是否已被打开</span>
<span style="color: rgba(0, 128, 128, 1)"> 372</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 373</span> Result := <span style="color: rgba(0, 0, 255, 1)">not</span><span style="color: rgba(0, 0, 0, 1)"> self.IsInvalidHandle(self.FCommHandle);
</span><span style="color: rgba(0, 128, 128, 1)"> 374</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 375</span>
<span style="color: rgba(0, 128, 128, 1)"> 376</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.SetHandleInvalid();
</span><span style="color: rgba(0, 128, 128, 1)"> 377</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 将串口句柄设置为无效句柄</span>
<span style="color: rgba(0, 128, 128, 1)"> 378</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 379</span> self.FCommHandle :=<span style="color: rgba(0, 0, 0, 1)"> INVALID_HANDLE_VALUE;
</span><span style="color: rgba(0, 128, 128, 1)"> 380</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 381</span>
<span style="color: rgba(0, 128, 128, 1)"> 382</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TSerialPort.IsInvalidHandle(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AHandle: NativeUInt) : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)"> 383</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 判断串口句柄是否有效</span>
<span style="color: rgba(0, 128, 128, 1)"> 384</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 385</span> Result := (AHandle =<span style="color: rgba(0, 0, 0, 1)"> INVALID_HANDLE_VALUE);
</span><span style="color: rgba(0, 128, 128, 1)"> 386</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 387</span>
<span style="color: rgba(0, 128, 128, 1)"> 388</span>
<span style="color: rgba(0, 128, 128, 1)"> 389</span>
<span style="color: rgba(0, 128, 128, 1)"> 390</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.Open();
</span><span style="color: rgba(0, 128, 128, 1)"> 391</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 打开端口, 如果有问题会抛出异常</span>
<span style="color: rgba(0, 128, 128, 1)"> 392</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 393</span> <span style="color: rgba(0, 0, 0, 1)">LPortNumber : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 394</span> <span style="color: rgba(0, 0, 0, 1)">LTmpHandle : THandle;
</span><span style="color: rgba(0, 128, 128, 1)"> 395</span> <span style="color: rgba(0, 0, 0, 1)">LErrCode: Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 396</span> <span style="color: rgba(0, 0, 0, 1)">LFileType : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 397</span> <span style="color: rgba(0, 0, 0, 1)">LErrors : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 398</span> <span style="color: rgba(0, 0, 0, 1)">LCommProp : TCommProp;
</span><span style="color: rgba(0, 128, 128, 1)"> 399</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> only for function parameter</span>
<span style="color: rgba(0, 128, 128, 1)"> 400</span> <span style="color: rgba(0, 0, 0, 1)">LPinStatus : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 401</span> <span style="color: rgba(0, 0, 0, 1)">LComStat: ComStat;
</span><span style="color: rgba(0, 128, 128, 1)"> 402</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 403</span> <span style="color: rgba(0, 0, 255, 1)">if</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 404</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">SerialPort is already open</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 405</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 406</span>
<span style="color: rgba(0, 128, 128, 1)"> 407</span> LPortNumber :=<span style="color: rgba(0, 0, 0, 1)"> self.CheckAndGetComNumber(self.FCommName);
</span><span style="color: rgba(0, 128, 128, 1)"> 408</span>
<span style="color: rgba(0, 128, 128, 1)"> 409</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建句柄, 使用 tmpHandle 保存</span>
<span style="color: rgba(0, 128, 128, 1)"> 410</span> LTmpHandle :=<span style="color: rgba(0, 0, 0, 1)"> CreateFile(
</span><span style="color: rgba(0, 128, 128, 1)"> 411</span> PChar(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\\?\COM</span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> Integer.ToString(LPortNumber)),
</span><span style="color: rgba(0, 128, 128, 1)"> 412</span> GENERIC_READ <span style="color: rgba(0, 0, 255, 1)">or</span> GENERIC_WRITE,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 读写访问</span>
<span style="color: rgba(0, 128, 128, 1)"> 413</span> <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> comm devices must be opened w/exclusive-access</span>
<span style="color: rgba(0, 128, 128, 1)"> 414</span> <span style="color: rgba(0, 0, 255, 1)">nil</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 安全属性 default security attributes</span>
<span style="color: rgba(0, 128, 128, 1)"> 415</span> OPEN_EXISTING, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> comm devices must use OPEN_EXISTING</span>
<span style="color: rgba(0, 128, 128, 1)"> 416</span> FILE_FLAG_OVERLAPPED, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 异步</span>
<span style="color: rgba(0, 128, 128, 1)"> 417</span> <span style="color: rgba(128, 0, 128, 1)">0</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> hTemplate must be NULL for comm devices</span>
<span style="color: rgba(0, 128, 128, 1)"> 418</span>
<span style="color: rgba(0, 128, 128, 1)"> 419</span> <span style="color: rgba(0, 0, 255, 1)">if</span> self.IsInvalidHandle(LTmpHandle) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 420</span> LErrCode :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 421</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Open port failed invalied_handle_value, caused by error %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 422</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 423</span>
<span style="color: rgba(0, 128, 128, 1)"> 424</span> <span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 128, 1)"> 425</span> LFileType :=<span style="color: rgba(0, 0, 0, 1)"> GetFileType(LTmpHandle);
</span><span style="color: rgba(0, 128, 128, 1)"> 426</span>
<span style="color: rgba(0, 128, 128, 1)"> 427</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Allowing FILE_TYPE_UNKNOWN for legitimate serial device such as USB to serial adapter device</span>
<span style="color: rgba(0, 128, 128, 1)"> 428</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ((LFileType <> FILE_TYPE_CHAR) <span style="color: rgba(0, 0, 255, 1)">and</span> (LFileType <> FILE_TYPE_UNKNOWN)) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 429</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The given port name (%s) does not resolve to a valid serial port</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 430</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)"> 431</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 432</span>
<span style="color: rgba(0, 128, 128, 1)"> 433</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把 tmpHandle 的值赋到 字段 FCommHandle 上来,</span>
<span style="color: rgba(0, 128, 128, 1)"> 434</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 但 tmpHandle 的值不动, 上面抛出异常或下面发生错误时 close tmpHandle</span>
<span style="color: rgba(0, 128, 128, 1)"> 435</span> self.FCommHandle :=<span style="color: rgba(0, 0, 0, 1)"> LTmpHandle;
</span><span style="color: rgba(0, 128, 128, 1)"> 436</span>
<span style="color: rgba(0, 128, 128, 1)"> 437</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span><span style="color: rgba(0, 0, 0, 1)">(GetCommProperties(LTmpHandle, LCommProp)))
</span><span style="color: rgba(0, 128, 128, 1)"> 438</span> <span style="color: rgba(0, 0, 255, 1)">or</span>(<span style="color: rgba(0, 0, 255, 1)">not</span><span style="color: rgba(0, 0, 0, 1)">(GetCommModemStatus(LTmpHandle, LPinStatus)))
</span><span style="color: rgba(0, 128, 128, 1)"> 439</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 440</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> If the portName they have passed in is a FILE_TYPE_CHAR but not a serial port,</span>
<span style="color: rgba(0, 128, 128, 1)"> 441</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> for example "LPT1", this API will fail.For this reason we handle the error message specially.</span>
<span style="color: rgba(0, 128, 128, 1)"> 442</span> LErrCode :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 443</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ((LErrCode = ERROR_INVALID_PARAMETER) <span style="color: rgba(0, 0, 255, 1)">or</span> (LErrCode = ERROR_INVALID_HANDLE)) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 444</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The given port name (%s) is invalid. It may be a valid port, but not a serial port.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 445</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 446</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 447</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Win32Marshal.GetExceptionForWin32Error(errorCode, string.Empty);</span>
<span style="color: rgba(0, 128, 128, 1)"> 448</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Open port failed, caused by error %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 449</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 450</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 451</span>
<span style="color: rgba(0, 128, 128, 1)"> 452</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ((LCommProp.dwMaxBaud <> <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (Cardinal(self.BaudRate) > LCommProp.dwMaxBaud)) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 453</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The maximum baud rate for the device is %d.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 454</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 455</span>
<span style="color: rgba(0, 128, 128, 1)"> 456</span> <span style="color: rgba(0, 0, 0, 1)"> self.ConfigDCB(LCommProp);
</span><span style="color: rgba(0, 128, 128, 1)"> 457</span> <span style="color: rgba(0, 0, 0, 1)"> self.ConfigEvents();
</span><span style="color: rgba(0, 128, 128, 1)"> 458</span> <span style="color: rgba(0, 0, 0, 1)"> self.ConfigTimeouts();
</span><span style="color: rgba(0, 128, 128, 1)"> 459</span> <span style="color: rgba(0, 0, 0, 1)"> self.ConfigBufferSizes();
</span><span style="color: rgba(0, 128, 128, 1)"> 460</span>
<span style="color: rgba(0, 128, 128, 1)"> 461</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO process errors</span>
<span style="color: rgba(0, 128, 128, 1)"> 462</span> PurgeComm(self.FCommHandle, PURGE_TXABORT <span style="color: rgba(0, 0, 255, 1)">or</span> PURGE_RXABORT <span style="color: rgba(0, 0, 255, 1)">or</span> PURGE_TXCLEAR <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> PURGE_RXCLEAR);
</span><span style="color: rgba(0, 128, 128, 1)"> 463</span> <span style="color: rgba(0, 0, 0, 1)"> ClearCommError(self.FCommHandle, LErrors, @LComStat);
</span><span style="color: rgba(0, 128, 128, 1)"> 464</span>
<span style="color: rgba(0, 128, 128, 1)"> 465</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 启动事件循环</span>
<span style="color: rgba(0, 128, 128, 1)"> 466</span> self.FEventLoop := TSerialPort.TEventLoop.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(self.FCommHandle);
</span><span style="color: rgba(0, 128, 128, 1)"> 467</span> <span style="color: rgba(0, 0, 0, 1)"> self.FEventLoop.Start();
</span><span style="color: rgba(0, 128, 128, 1)"> 468</span> <span style="color: rgba(0, 0, 255, 1)">except</span>
<span style="color: rgba(0, 128, 128, 1)"> 469</span> <span style="color: rgba(0, 0, 0, 1)"> self.SetHandleInvalid();
</span><span style="color: rgba(0, 128, 128, 1)"> 470</span>
<span style="color: rgba(0, 128, 128, 1)"> 471</span> <span style="color: rgba(0, 0, 0, 1)"> CloseHandle(LTmpHandle);
</span><span style="color: rgba(0, 128, 128, 1)"> 472</span> <span style="color: rgba(0, 0, 255, 1)">raise</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 473</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 474</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 475</span>
<span style="color: rgba(0, 128, 128, 1)"> 476</span>
<span style="color: rgba(0, 128, 128, 1)"> 477</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.Close();
</span><span style="color: rgba(0, 128, 128, 1)"> 478</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭串口</span>
<span style="color: rgba(0, 128, 128, 1)"> 479</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 480</span> <span style="color: rgba(0, 0, 0, 1)">LTmpHandle : THandle;
</span><span style="color: rgba(0, 128, 128, 1)"> 481</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 482</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 483</span> <span style="color: rgba(0, 0, 0, 1)"> Exit;
</span><span style="color: rgba(0, 128, 128, 1)"> 484</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 485</span>
<span style="color: rgba(0, 128, 128, 1)"> 486</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 停止事件循环</span>
<span style="color: rgba(0, 128, 128, 1)"> 487</span> <span style="color: rgba(0, 0, 0, 1)">self.FEventLoop.Stop();
</span><span style="color: rgba(0, 128, 128, 1)"> 488</span> <span style="color: rgba(0, 0, 255, 1)">FreeAndNil</span><span style="color: rgba(0, 0, 0, 1)">(self.FEventLoop);
</span><span style="color: rgba(0, 128, 128, 1)"> 489</span>
<span style="color: rgba(0, 128, 128, 1)"> 490</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 处理串口句柄</span>
<span style="color: rgba(0, 128, 128, 1)"> 491</span> LTmpHandle :=<span style="color: rgba(0, 0, 0, 1)"> self.FCommHandle;
</span><span style="color: rgba(0, 128, 128, 1)"> 492</span> <span style="color: rgba(0, 0, 0, 1)">self.SetHandleInvalid();
</span><span style="color: rgba(0, 128, 128, 1)"> 493</span>
<span style="color: rgba(0, 128, 128, 1)"> 494</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODOprocess errors</span>
<span style="color: rgba(0, 128, 128, 1)"> 495</span> SetCommMask(LTmpHandle, <span style="color: rgba(128, 0, 128, 1)">0</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 禁止所有事件</span>
<span style="color: rgba(0, 128, 128, 1)"> 496</span> EscapeCommFunction(LTmpHandle, CLRDTR); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 清除信号</span>
<span style="color: rgba(0, 128, 128, 1)"> 497</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 丢弃未完成的内容, 终止所有操作</span>
<span style="color: rgba(0, 128, 128, 1)"> 498</span> PurgeComm(LTmpHandle, PURGE_TXABORT <span style="color: rgba(0, 0, 255, 1)">or</span> PURGE_RXABORT <span style="color: rgba(0, 0, 255, 1)">or</span> PURGE_TXCLEAR <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> PURGE_RXCLEAR);
</span><span style="color: rgba(0, 128, 128, 1)"> 499</span>
<span style="color: rgba(0, 128, 128, 1)"> 500</span> <span style="color: rgba(0, 0, 0, 1)">CloseHandle(LTmpHandle);
</span><span style="color: rgba(0, 128, 128, 1)"> 501</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 502</span>
<span style="color: rgba(0, 128, 128, 1)"> 503</span>
<span style="color: rgba(0, 128, 128, 1)"> 504</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- read and write</span>
<span style="color: rgba(0, 128, 128, 1)"> 505</span>
<span style="color: rgba(0, 128, 128, 1)"> 506</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TSerialPort.ReadBytes(ABuff: TArray<Byte>; <span style="color: rgba(0, 0, 255, 1)">const</span> AOffset: Integer; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ACount: Integer) : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 507</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 读操作</span>
<span style="color: rgba(0, 128, 128, 1)"> 508</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO 方法的实现需要仔细检查</span>
<span style="color: rgba(0, 128, 128, 1)"> 509</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 510</span> <span style="color: rgba(0, 0, 0, 1)">LReadResult : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)"> 511</span> <span style="color: rgba(0, 0, 0, 1)">LLenReaded: Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 512</span> <span style="color: rgba(0, 0, 0, 1)">LLastErr : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 513</span> <span style="color: rgba(0, 0, 0, 1)">LWaitResult : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 514</span> <span style="color: rgba(0, 0, 0, 1)">LReadOv : TOverlapped;
</span><span style="color: rgba(0, 128, 128, 1)"> 515</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 516</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 517</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The serialPort is closed</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 518</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 519</span>
<span style="color: rgba(0, 128, 128, 1)"> 520</span> <span style="color: rgba(0, 0, 0, 1)">self.CheckReadWriteArguments(ABuff, AOffset, ACount);
</span><span style="color: rgba(0, 128, 128, 1)"> 521</span>
<span style="color: rgba(0, 128, 128, 1)"> 522</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ACount = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 523</span> Result := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 524</span> <span style="color: rgba(0, 0, 0, 1)"> Exit;
</span><span style="color: rgba(0, 128, 128, 1)"> 525</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 526</span>
<span style="color: rgba(0, 128, 128, 1)"> 527</span> FillChar(LReadOv, SizeOf(LReadOv), <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 528</span> LReadOv.hEvent := CreateEvent(<span style="color: rgba(0, 0, 255, 1)">nil</span>, True, False, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 529</span>
<span style="color: rgba(0, 128, 128, 1)"> 530</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LReadOv.hEvent = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 531</span> LLastErr :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 532</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Create event failed in read bytes, %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 533</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 534</span>
<span style="color: rgba(0, 128, 128, 1)"> 535</span> LReadResult :=<span style="color: rgba(0, 0, 0, 1)"> ReadFile(self.FCommHandle,
</span><span style="color: rgba(0, 128, 128, 1)"> 536</span> <span style="color: rgba(0, 0, 0, 1)"> ABuff,
</span><span style="color: rgba(0, 128, 128, 1)"> 537</span> <span style="color: rgba(0, 0, 0, 1)"> ACount,
</span><span style="color: rgba(0, 128, 128, 1)"> 538</span> <span style="color: rgba(0, 0, 0, 1)"> LLenReaded,
</span><span style="color: rgba(0, 128, 128, 1)"> 539</span> <span style="color: rgba(0, 0, 0, 1)"> @LReadOv);
</span><span style="color: rgba(0, 128, 128, 1)"> 540</span>
<span style="color: rgba(0, 128, 128, 1)"> 541</span> <span style="color: rgba(0, 0, 255, 1)">if</span> LReadResult <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 542</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> LLenReaded;
</span><span style="color: rgba(0, 128, 128, 1)"> 543</span> <span style="color: rgba(0, 0, 0, 1)"> Exit;
</span><span style="color: rgba(0, 128, 128, 1)"> 544</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 545</span>
<span style="color: rgba(0, 128, 128, 1)"> 546</span> LLastErr :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 547</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span>(LLastErr = ERROR_IO_PENDING) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 548</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO error description</span>
<span style="color: rgba(0, 128, 128, 1)"> 549</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Read failed, caused by %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 550</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 551</span>
<span style="color: rgba(0, 128, 128, 1)"> 552</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO 观察 C# 对这里超时是怎样处理的</span>
<span style="color: rgba(0, 128, 128, 1)"> 553</span> LWaitResult :=<span style="color: rgba(0, 0, 0, 1)"> WaitForSingleObject(LReadOv.hEvent, INFINITE);
</span><span style="color: rgba(0, 128, 128, 1)"> 554</span>
<span style="color: rgba(0, 128, 128, 1)"> 555</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO 考虑下面需要做哪些事情</span>
<span style="color: rgba(0, 128, 128, 1)"> 556</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LWaitResult = WAIT_OBJECT_<span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 557</span> <span style="color: rgba(0, 0, 255, 1)">if</span> GetOverlappedResult(self.FCommHandle, LReadOv, LLenReaded, False) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 558</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> LLenReaded;
</span><span style="color: rgba(0, 128, 128, 1)"> 559</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Break;</span>
<span style="color: rgba(0, 128, 128, 1)"> 560</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 561</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 562</span> Result := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 563</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Break;</span>
<span style="color: rgba(0, 128, 128, 1)"> 564</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 565</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 566</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LWaitResult = WAIT_TIMEOUT) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 567</span> <span style="color: rgba(0, 0, 0, 1)"> CancelIO(self.FCommHandle);
</span><span style="color: rgba(0, 128, 128, 1)"> 568</span>
<span style="color: rgba(0, 128, 128, 1)"> 569</span> Result := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 570</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO timeout</span>
<span style="color: rgba(0, 128, 128, 1)"> 571</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 572</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 573</span> Result := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 574</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 575</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 576</span>
<span style="color: rgba(0, 128, 128, 1)"> 577</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.WriteBytes(ABuff: TArray<System.Byte>; <span style="color: rgba(0, 0, 255, 1)">const</span> AOffset: Integer; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ACount: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 578</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 写操作</span>
<span style="color: rgba(0, 128, 128, 1)"> 579</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO 方法的实现需要仔细检查,</span>
<span style="color: rgba(0, 128, 128, 1)"> 580</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 当前的实现不能保证把所有的数据都发送出去, 所以这里还需要更多处理</span>
<span style="color: rgba(0, 128, 128, 1)"> 581</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 582</span> <span style="color: rgba(0, 0, 0, 1)">LWriteResult : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)"> 583</span> <span style="color: rgba(0, 0, 0, 1)">LWriteOv : TOverlapped;
</span><span style="color: rgba(0, 128, 128, 1)"> 584</span> <span style="color: rgba(0, 0, 0, 1)">LLenSent : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 585</span> <span style="color: rgba(0, 0, 0, 1)">LWriteErr : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 586</span> <span style="color: rgba(0, 0, 0, 1)">LWaitResult : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 587</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 588</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 589</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The serialPort is closed</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 590</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 591</span>
<span style="color: rgba(0, 128, 128, 1)"> 592</span> <span style="color: rgba(0, 0, 0, 1)">self.CheckReadWriteArguments(ABuff, AOffset, ACount);
</span><span style="color: rgba(0, 128, 128, 1)"> 593</span>
<span style="color: rgba(0, 128, 128, 1)"> 594</span> FillChar(LWriteOv, SizeOf(LWriteOv), <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 595</span>
<span style="color: rgba(0, 128, 128, 1)"> 596</span> LWriteOv.hEvent := CreateEvent(<span style="color: rgba(0, 0, 255, 1)">nil</span>, True, False, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 597</span>
<span style="color: rgba(0, 128, 128, 1)"> 598</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LWriteOv.hEvent = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 599</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Write failed, cuased by create event error %d.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 600</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 601</span>
<span style="color: rgba(0, 128, 128, 1)"> 602</span> <span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 128, 1)"> 603</span> LWriteResult :=<span style="color: rgba(0, 0, 0, 1)"> WriteFile( self.FCommHandle,
</span><span style="color: rgba(0, 128, 128, 1)"> 604</span> <span style="color: rgba(0, 0, 0, 1)"> ABuff,
</span><span style="color: rgba(0, 128, 128, 1)"> 605</span> <span style="color: rgba(0, 0, 0, 1)"> ACount,
</span><span style="color: rgba(0, 128, 128, 1)"> 606</span> <span style="color: rgba(0, 0, 0, 1)"> LLenSent,
</span><span style="color: rgba(0, 128, 128, 1)"> 607</span> <span style="color: rgba(0, 0, 0, 1)"> @LWriteOv);
</span><span style="color: rgba(0, 128, 128, 1)"> 608</span>
<span style="color: rgba(0, 128, 128, 1)"> 609</span> <span style="color: rgba(0, 0, 255, 1)">if</span> LWriteResult <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 610</span> Exit;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送完, 退出</span>
<span style="color: rgba(0, 128, 128, 1)"> 611</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 612</span>
<span style="color: rgba(0, 128, 128, 1)"> 613</span> LWriteErr :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 614</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LWriteErr <> ERROR_IO_PENDING) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 615</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO error description</span>
<span style="color: rgba(0, 128, 128, 1)"> 616</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Write failed, error %d.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 617</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 618</span>
<span style="color: rgba(0, 128, 128, 1)"> 619</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO configure wait timeout</span>
<span style="color: rgba(0, 128, 128, 1)"> 620</span> LWaitResult :=<span style="color: rgba(0, 0, 0, 1)"> WaitForSingleObject(LWriteOv.hEvent, INFINITE);
</span><span style="color: rgba(0, 128, 128, 1)"> 621</span>
<span style="color: rgba(0, 128, 128, 1)"> 622</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LWaitResult = WAIT_OBJECT_<span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 623</span> <span style="color: rgba(0, 0, 255, 1)">if</span> GetOverlappedResult(self.FCommHandle, LWriteOv, LLenSent, False) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 624</span> <span style="color: rgba(0, 0, 0, 1)"> Exit;
</span><span style="color: rgba(0, 128, 128, 1)"> 625</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 626</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 627</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO type an exception</span>
<span style="color: rgba(0, 128, 128, 1)"> 628</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Write failed, error %d.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 629</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 630</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 631</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LWaitResult = WAIT_TIMEOUT) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 632</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO timeout</span>
<span style="color: rgba(0, 128, 128, 1)"> 633</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Write failed, timeout.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 634</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 635</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 636</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Write failed, Wait result %d.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 637</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 638</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> write finished</span>
<span style="color: rgba(0, 128, 128, 1)"> 639</span> <span style="color: rgba(0, 0, 255, 1)">finally</span>
<span style="color: rgba(0, 128, 128, 1)"> 640</span> <span style="color: rgba(0, 0, 0, 1)"> CloseHandle(LWriteOv.hEvent);
</span><span style="color: rgba(0, 128, 128, 1)"> 641</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 642</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 643</span>
<span style="color: rgba(0, 128, 128, 1)"> 644</span>
<span style="color: rgba(0, 128, 128, 1)"> 645</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.CheckReadWriteArguments(<span style="color: rgba(0, 0, 255, 1)">const</span> AArr: TArray<System.Byte>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AOffset, ACount: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 646</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检查读写操作的输入参数</span>
<span style="color: rgba(0, 128, 128, 1)"> 647</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 648</span> <span style="color: rgba(0, 0, 0, 1)">LLen : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 649</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 650</span> LLen :=<span style="color: rgba(0, 0, 0, 1)"> Length(AArr);
</span><span style="color: rgba(0, 128, 128, 1)"> 651</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LLen <= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 652</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Null bytes buffer</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 653</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 654</span>
<span style="color: rgba(0, 128, 128, 1)"> 655</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (AOffset < <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 656</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Non-negative number required, offset</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 657</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 658</span>
<span style="color: rgba(0, 128, 128, 1)"> 659</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ACount < <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 660</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Non-negative number required, count</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 661</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 662</span>
<span style="color: rgba(0, 128, 128, 1)"> 663</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (LLen - AOffset < ACount) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 664</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Offset and length were out of bounds for the array </span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 665</span> + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">or count is greater than the number of elements from index to the end of the source collection</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 666</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 667</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 668</span>
<span style="color: rgba(0, 128, 128, 1)"> 669</span>
<span style="color: rgba(0, 128, 128, 1)"> 670</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TSerialPort.CheckAndGetComNumber(<span style="color: rgba(0, 0, 255, 1)">const</span> AComName: <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">) : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 671</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检查和串口名是不是 COM后面跟着数字 的格式, 如果是则返回数字, 否则抛出异常</span>
<span style="color: rgba(0, 128, 128, 1)"> 672</span> <span style="color: rgba(0, 0, 255, 1)">const</span>
<span style="color: rgba(0, 128, 128, 1)"> 673</span> LStrInvalidPortNameFmt = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The given port name (%s) does not resolve to a valid serial port</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 674</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 675</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> AComName.StartsWith(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">COM</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, True))
</span><span style="color: rgba(0, 128, 128, 1)"> 676</span> <span style="color: rgba(0, 0, 255, 1)">or</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> Integer.TryParse(AComName.Substring(<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">), Result))
</span><span style="color: rgba(0, 128, 128, 1)"> 677</span> <span style="color: rgba(0, 0, 255, 1)">or</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> Result > <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 678</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 679</span> <span style="color: rgba(0, 0, 255, 1)">raise</span><span style="color: rgba(0, 0, 0, 1)"> ESerialPort.CreateFmt(LStrInvalidPortNameFmt, );
</span><span style="color: rgba(0, 128, 128, 1)"> 680</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 681</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 682</span>
<span style="color: rgba(0, 128, 128, 1)"> 683</span>
<span style="color: rgba(0, 128, 128, 1)"> 684</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- about comm config</span>
<span style="color: rgba(0, 128, 128, 1)"> 685</span>
<span style="color: rgba(0, 128, 128, 1)"> 686</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.ConfigEvents();
</span><span style="color: rgba(0, 128, 128, 1)"> 687</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置事件</span>
<span style="color: rgba(0, 128, 128, 1)"> 688</span> <span style="color: rgba(0, 0, 255, 1)">const</span>
<span style="color: rgba(0, 128, 128, 1)"> 689</span> LEV_ALL = ( EV_BREAK <span style="color: rgba(0, 0, 255, 1)">or</span> EV_CTS <span style="color: rgba(0, 0, 255, 1)">or</span> EV_DSR <span style="color: rgba(0, 0, 255, 1)">or</span> EV_ERR <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> EV_RING
</span><span style="color: rgba(0, 128, 128, 1)"> 690</span> <span style="color: rgba(0, 0, 255, 1)">or</span> EV_RLSD<span style="color: rgba(0, 0, 255, 1)">or</span> EV_RXCHAR <span style="color: rgba(0, 0, 255, 1)">or</span> EV_RXFLAG <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> EV_TXEMPTY);
</span><span style="color: rgba(0, 128, 128, 1)"> 691</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 692</span> <span style="color: rgba(0, 0, 0, 1)">LErrCode : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 693</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 694</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置事件, 把所有的事件都设置了, 虽然没有处理这些事件</span>
<span style="color: rgba(0, 128, 128, 1)"> 695</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> SetCommMask(self.FCommHandle, LEV_ALL) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 696</span> LErrCode :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 697</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">SetCommMask failed, caused by %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 698</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 699</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 700</span>
<span style="color: rgba(0, 128, 128, 1)"> 701</span>
<span style="color: rgba(0, 128, 128, 1)"> 702</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.ConfigDCB(ACommProp : TCommProp);
</span><span style="color: rgba(0, 128, 128, 1)"> 703</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置 设备控制块</span>
<span style="color: rgba(0, 128, 128, 1)"> 704</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO 完善</span>
<span style="color: rgba(0, 128, 128, 1)"> 705</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 706</span> <span style="color: rgba(0, 0, 0, 1)">LDcb : TDCB;
</span><span style="color: rgba(0, 128, 128, 1)"> 707</span> <span style="color: rgba(0, 0, 0, 1)">LErrCode : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 708</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 709</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> GetCommState(self.FCommHandle, LDcb) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 710</span> LErrCode :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 711</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Get DCB failed, caused by %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 712</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 713</span>
<span style="color: rgba(0, 128, 128, 1)"> 714</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO others</span>
<span style="color: rgba(0, 128, 128, 1)"> 715</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">LDcb.DCBlength := SizeOf(TDCB);</span>
<span style="color: rgba(0, 128, 128, 1)"> 716</span>
<span style="color: rgba(0, 128, 128, 1)"> 717</span> LDcb.BaudRate :=<span style="color: rgba(0, 0, 0, 1)"> self.FBaudRate;
</span><span style="color: rgba(0, 128, 128, 1)"> 718</span> LDcb.Parity :=<span style="color: rgba(0, 0, 0, 1)"> self.FParity;
</span><span style="color: rgba(0, 128, 128, 1)"> 719</span> LDcb.ByteSize :=<span style="color: rgba(0, 0, 0, 1)"> self.FDataBits;
</span><span style="color: rgba(0, 128, 128, 1)"> 720</span> LDcb.StopBits :=<span style="color: rgba(0, 0, 0, 1)"> self.FStopBit;
</span><span style="color: rgba(0, 128, 128, 1)"> 721</span>
<span style="color: rgba(0, 128, 128, 1)"> 722</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> always true for communications resources</span>
<span style="color: rgba(0, 128, 128, 1)"> 723</span> SetDcbFlag(LDcb, DCBFlags.FBINARY, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 724</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">LDcb.Flags := 1;</span>
<span style="color: rgba(0, 128, 128, 1)"> 725</span>
<span style="color: rgba(0, 128, 128, 1)"> 726</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (self.FParity = TParityTool.None) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 727</span> SetDcbFlag(LDcb, DCBFlags.FPARITY, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 728</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 729</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 730</span> SetDcbFlag(LDcb, DCBFlags.FPARITY, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 731</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 732</span>
<span style="color: rgba(0, 128, 128, 1)"> 733</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Note-1</span>
<span style="color: rgba(0, 128, 128, 1)"> 734</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不支持这个东西, 不了解它, C# 默认Handshake.None</span>
<span style="color: rgba(0, 128, 128, 1)"> 735</span> SetDcbFlag(LDcb, DCBFlags.FOUTXCTSFLOW, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 736</span>
<span style="color: rgba(0, 128, 128, 1)"> 737</span> SetDcbFlag(LDcb, DCBFlags.FOUTXDSRFLOW, <span style="color: rgba(128, 0, 128, 1)">0</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> dsrTimeout is always set to 0.</span>
<span style="color: rgba(0, 128, 128, 1)"> 738</span> <span style="color: rgba(0, 0, 0, 1)">SetDcbFlag(LDcb, DCBFlags.FDTRCONTROL, DCBDTRFlowControl.DTR_CONTROL_DISABLE);
</span><span style="color: rgba(0, 128, 128, 1)"> 739</span> SetDcbFlag(LDcb, DCBFlags.FDSRSENSITIVITY, <span style="color: rgba(128, 0, 128, 1)">0</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> this should remain off</span>
<span style="color: rgba(0, 128, 128, 1)"> 740</span>
<span style="color: rgba(0, 128, 128, 1)"> 741</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 同 Note-1</span>
<span style="color: rgba(0, 128, 128, 1)"> 742</span> SetDcbFlag(LDcb, DCBFlags.FINX, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 743</span> SetDcbFlag(LDcb, DCBFlags.FOUTX, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 744</span>
<span style="color: rgba(0, 128, 128, 1)"> 745</span>
<span style="color: rgba(0, 128, 128, 1)"> 746</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> if no parity, we have no error character (i.e. ErrorChar = '\0' or null character)</span>
<span style="color: rgba(0, 128, 128, 1)"> 747</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (self.FParity = TParityTool.None) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 748</span> SetDcbFlag(LDcb, DCBFlags.FERRORCHAR, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 749</span> LDcb.ErrorChar := #<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 750</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 751</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 752</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Ord(self.FParityReplace) = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 753</span> SetDcbFlag(LDcb, DCBFlags.FERRORCHAR, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 754</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 755</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 756</span> SetDcbFlag(LDcb, DCBFlags.FERRORCHAR, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 757</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 758</span>
<span style="color: rgba(0, 128, 128, 1)"> 759</span> LDcb.ErrorChar :=<span style="color: rgba(0, 0, 0, 1)"> self.FParityReplace;
</span><span style="color: rgba(0, 128, 128, 1)"> 760</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 761</span>
<span style="color: rgba(0, 128, 128, 1)"> 762</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Note-2 默认 C# 默认 false</span>
<span style="color: rgba(0, 128, 128, 1)"> 763</span> SetDcbFlag(LDcb, DCBFlags.FNULL, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 764</span>
<span style="color: rgba(0, 128, 128, 1)"> 765</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> SerialStream does not handle the fAbortOnError behaviour, so we must make sure it's not enabled</span>
<span style="color: rgba(0, 128, 128, 1)"> 766</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> C# 的 SerialStream</span>
<span style="color: rgba(0, 128, 128, 1)"> 767</span> SetDcbFlag(LDcb, DCBFlags.FABORTONOERROR, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 768</span>
<span style="color: rgba(0, 128, 128, 1)"> 769</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Setting RTS control, which is RTS_CONTROL_HANDSHAKE if RTS / RTS-XOnXOff handshaking</span>
<span style="color: rgba(0, 128, 128, 1)"> 770</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> used, RTS_ENABLE (RTS pin used during operation) if rtsEnable true but XOnXoff / No handshaking</span>
<span style="color: rgba(0, 128, 128, 1)"> 771</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> used, and disabled otherwise.</span>
<span style="color: rgba(0, 128, 128, 1)"> 772</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> C# 这里有与 Handshake 有关的处理</span>
<span style="color: rgba(0, 128, 128, 1)"> 773</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (GetDcbFlag(LDcb, DCBFlags.FRTSCONTROL) = DCBRTSFlowControl.RTS_CONTROL_HANDSHAKE) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 774</span> <span style="color: rgba(0, 0, 0, 1)"> SetDcbFlag(LDcb, DCBFlags.FRTSCONTROL, DCBRTSFlowControl.RTS_CONTROL_DISABLE);
</span><span style="color: rgba(0, 128, 128, 1)"> 775</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 776</span>
<span style="color: rgba(0, 128, 128, 1)"> 777</span> LDcb.XonChar:= TDCBTool.DEFAULTXONCHAR; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> may be exposed later but for now, constant</span>
<span style="color: rgba(0, 128, 128, 1)"> 778</span> LDcb.XoffChar :=<span style="color: rgba(0, 0, 0, 1)"> TDCBTool.DEFAULTXOFFCHAR;
</span><span style="color: rgba(0, 128, 128, 1)"> 779</span>
<span style="color: rgba(0, 128, 128, 1)"> 780</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> minimum number of bytes allowed in each buffer before flow control activated</span>
<span style="color: rgba(0, 128, 128, 1)"> 781</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> heuristically, this has been set at 1/4 of the buffer size</span>
<span style="color: rgba(0, 128, 128, 1)"> 782</span> LDcb.XonLim:= (ACommProp.dwCurrentRxQueue <span style="color: rgba(0, 0, 255, 1)">div</span> <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 783</span> LDcb.XoffLim := (ACommProp.dwCurrentRxQueue <span style="color: rgba(0, 0, 255, 1)">div</span> <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 784</span>
<span style="color: rgba(0, 128, 128, 1)"> 785</span> LDcb.EofChar :=<span style="color: rgba(0, 0, 0, 1)"> TDCBTool.EOFCHAR;
</span><span style="color: rgba(0, 128, 128, 1)"> 786</span>
<span style="color: rgba(0, 128, 128, 1)"> 787</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> OLD MSCOMM: dcb.EvtChar = (byte) 0;</span>
<span style="color: rgba(0, 128, 128, 1)"> 788</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> now changed to make use of RXFlag WaitCommEvent event => Eof WaitForCommEvent event</span>
<span style="color: rgba(0, 128, 128, 1)"> 789</span> LDcb.EvtChar :=<span style="color: rgba(0, 0, 0, 1)"> TDCBTool.EOFCHAR;
</span><span style="color: rgba(0, 128, 128, 1)"> 790</span>
<span style="color: rgba(0, 128, 128, 1)"> 791</span>
<span style="color: rgba(0, 128, 128, 1)"> 792</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> SetCommState(self.FCommHandle, LDcb) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 793</span> LErrCode :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 794</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Set DCB failed, caused by %d.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 795</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 796</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 797</span>
<span style="color: rgba(0, 128, 128, 1)"> 798</span>
<span style="color: rgba(0, 128, 128, 1)"> 799</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.ConfigTimeouts();
</span><span style="color: rgba(0, 128, 128, 1)"> 800</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置超时</span>
<span style="color: rgba(0, 128, 128, 1)"> 801</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 802</span> <span style="color: rgba(0, 0, 0, 1)">LTimeouts : TCommTimeouts;
</span><span style="color: rgba(0, 128, 128, 1)"> 803</span> <span style="color: rgba(0, 0, 0, 1)">LErrCode : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 804</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 805</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> GetCommTimeouts(self.FCommHandle, LTimeouts) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 806</span> LErrCode :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 807</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Get timeouts failed, caused by %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 808</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 809</span>
<span style="color: rgba(0, 128, 128, 1)"> 810</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (self.FReadTimeOut = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 811</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不使用超时, 读操作总是立即返回</span>
<span style="color: rgba(0, 128, 128, 1)"> 812</span> LTimeouts.ReadIntervalTimeout :=<span style="color: rgba(0, 0, 0, 1)"> MAXDWORD;
</span><span style="color: rgba(0, 128, 128, 1)"> 813</span> LTimeouts.ReadTotalTimeoutMultiplier := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 814</span> LTimeouts.ReadTotalTimeoutConstant := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 815</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 816</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 817</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 固定超时</span>
<span style="color: rgba(0, 128, 128, 1)"> 818</span> LTimeouts.ReadIntervalTimeout :=<span style="color: rgba(0, 0, 0, 1)"> MAXDWORD;
</span><span style="color: rgba(0, 128, 128, 1)"> 819</span> LTimeouts.ReadTotalTimeoutMultiplier :=<span style="color: rgba(0, 0, 0, 1)"> MAXDWORD;
</span><span style="color: rgba(0, 128, 128, 1)"> 820</span> LTimeouts.ReadTotalTimeoutConstant :=<span style="color: rgba(0, 0, 0, 1)"> self.FReadTimeOut;
</span><span style="color: rgba(0, 128, 128, 1)"> 821</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 822</span>
<span style="color: rgba(0, 128, 128, 1)"> 823</span> LTimeouts.WriteTotalTimeoutMultiplier := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 824</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果 FWriteTimeout 设置为 0, 则不使用写超时</span>
<span style="color: rgba(0, 128, 128, 1)"> 825</span> LTimeouts.WriteTotalTimeoutConstant :=<span style="color: rgba(0, 0, 0, 1)"> self.FWriteTimeOut;
</span><span style="color: rgba(0, 128, 128, 1)"> 826</span>
<span style="color: rgba(0, 128, 128, 1)"> 827</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> SetCommTimeouts(self.FCommHandle, LTimeouts) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 828</span> LErrCode :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 829</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Set timeouts failed, caused by %d.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 830</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 831</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 832</span>
<span style="color: rgba(0, 128, 128, 1)"> 833</span>
<span style="color: rgba(0, 128, 128, 1)"> 834</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.ConfigBufferSizes;
</span><span style="color: rgba(0, 128, 128, 1)"> 835</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置缓冲区</span>
<span style="color: rgba(0, 128, 128, 1)"> 836</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 837</span> <span style="color: rgba(0, 0, 0, 1)">LErrCode : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 838</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 839</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span>(SetupComm(self.FCommHandle, self.FReadBufferSize, self.FWriteBufferSize)) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 840</span> LErrCode :=<span style="color: rgba(0, 0, 0, 1)"> GetLastError();
</span><span style="color: rgba(0, 128, 128, 1)"> 841</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Set buffer sizes failed, caused by %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 842</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 843</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 844</span>
<span style="color: rgba(0, 128, 128, 1)"> 845</span>
<span style="color: rgba(0, 128, 128, 1)"> 846</span>
<span style="color: rgba(0, 128, 128, 1)"> 847</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- about Dcb.Flags</span>
<span style="color: rgba(0, 128, 128, 1)"> 848</span>
<span style="color: rgba(0, 128, 128, 1)"> 849</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TSerialPort.GetDcbFlag(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ADcb : TDCB; AWhichFlag : Integer) : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 850</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> from C#</span>
<span style="color: rgba(0, 128, 128, 1)"> 851</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 852</span> <span style="color: rgba(0, 0, 0, 1)">LMask : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 853</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 854</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ((AWhichFlag = DCBFlags.FDTRCONTROL) <span style="color: rgba(0, 0, 255, 1)">or</span> (AWhichFlag = DCBFlags.FRTSCONTROL)) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 855</span> LMask := $<span style="color: rgba(128, 0, 128, 1)">03</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 856</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 857</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (AWhichFlag = DCBFlags.FDUMMY2) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 858</span> LMask :=<span style="color: rgba(0, 0, 0, 1)"> $1FFFF;
</span><span style="color: rgba(0, 128, 128, 1)"> 859</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 860</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 861</span> LMask := $<span style="color: rgba(128, 0, 128, 1)">01</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 862</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 863</span>
<span style="color: rgba(0, 128, 128, 1)"> 864</span> Result := ADcb.Flags <span style="color: rgba(0, 0, 255, 1)">and</span> (LMask <span style="color: rgba(0, 0, 255, 1)">shl</span><span style="color: rgba(0, 0, 0, 1)"> AWhichFlag);
</span><span style="color: rgba(0, 128, 128, 1)"> 865</span> Result := Result <span style="color: rgba(0, 0, 255, 1)">shr</span><span style="color: rgba(0, 0, 0, 1)"> AWhichFlag;
</span><span style="color: rgba(0, 128, 128, 1)"> 866</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 867</span>
<span style="color: rgba(0, 128, 128, 1)"> 868</span>
<span style="color: rgba(0, 128, 128, 1)"> 869</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetDcbFlag(<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> ADcb : TDCB; AWhichFlag : Integer; ASetting : Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 870</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> from C#</span>
<span style="color: rgba(0, 128, 128, 1)"> 871</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 872</span> <span style="color: rgba(0, 0, 0, 1)">LMask : Cardinal;
</span><span style="color: rgba(0, 128, 128, 1)"> 873</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 874</span> ASetting := ASetting <span style="color: rgba(0, 0, 255, 1)">shl</span><span style="color: rgba(0, 0, 0, 1)"> AWhichFlag;
</span><span style="color: rgba(0, 128, 128, 1)"> 875</span>
<span style="color: rgba(0, 128, 128, 1)"> 876</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ((AWhichFlag = DCBFlags.FDTRCONTROL) <span style="color: rgba(0, 0, 255, 1)">or</span> (AWhichFlag = DCBFlags.FRTSCONTROL)) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 877</span> LMask := $<span style="color: rgba(128, 0, 128, 1)">03</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 878</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 879</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (AWhichFlag = DCBFlags.FDUMMY2) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 880</span> LMask :=<span style="color: rgba(0, 0, 0, 1)"> $1FFFF;
</span><span style="color: rgba(0, 128, 128, 1)"> 881</span> <span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)"> 882</span> <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 883</span> LMask := $<span style="color: rgba(128, 0, 128, 1)">01</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 884</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 885</span>
<span style="color: rgba(0, 128, 128, 1)"> 886</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> clear the region</span>
<span style="color: rgba(0, 128, 128, 1)"> 887</span> ADcb.Flags := ADcb.Flags <span style="color: rgba(0, 0, 255, 1)">and</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> (LMask <span style="color: rgba(0, 0, 255, 1)">shl</span><span style="color: rgba(0, 0, 0, 1)"> ADcb.Flags));
</span><span style="color: rgba(0, 128, 128, 1)"> 888</span>
<span style="color: rgba(0, 128, 128, 1)"> 889</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> set the region</span>
<span style="color: rgba(0, 128, 128, 1)"> 890</span> ADcb.Flags := ADcb.Flags <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> ASetting;
</span><span style="color: rgba(0, 128, 128, 1)"> 891</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 892</span>
<span style="color: rgba(0, 128, 128, 1)"> 893</span>
<span style="color: rgba(0, 128, 128, 1)"> 894</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- for properties</span>
<span style="color: rgba(0, 128, 128, 1)"> 895</span>
<span style="color: rgba(0, 128, 128, 1)"> 896</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropCommName(<span style="color: rgba(0, 0, 255, 1)">const</span> ACommName: <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 897</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 898</span> <span style="color: rgba(0, 0, 255, 1)">if</span> Trim(ACommName) = <span style="color: rgba(128, 0, 0, 1)">''</span> <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 899</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The port name can not be empty</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 900</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 901</span>
<span style="color: rgba(0, 128, 128, 1)"> 902</span> <span style="color: rgba(0, 0, 255, 1)">if</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 903</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">"%s" can not be set while the port is open</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 904</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 905</span>
<span style="color: rgba(0, 128, 128, 1)"> 906</span> self.FCommName :=<span style="color: rgba(0, 0, 0, 1)"> ACommName;
</span><span style="color: rgba(0, 128, 128, 1)"> 907</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 908</span>
<span style="color: rgba(0, 128, 128, 1)"> 909</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropBaudRate(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ABaudRate: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 910</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 911</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> if not TBaudRateTool.IsSupportedBaudRate(ABaudRate) then begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 912</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ABaudRate <= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 913</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Unsupported bardrate %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 914</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 915</span>
<span style="color: rgba(0, 128, 128, 1)"> 916</span> self.FBaudRate :=<span style="color: rgba(0, 0, 0, 1)"> ABaudRate;
</span><span style="color: rgba(0, 128, 128, 1)"> 917</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 918</span>
<span style="color: rgba(0, 128, 128, 1)"> 919</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropParity(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AParity: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 920</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 921</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> TParityTool.IsSupportedParity(AParity) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 922</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Unsupported parity %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 923</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 924</span>
<span style="color: rgba(0, 128, 128, 1)"> 925</span> self.FParity :=<span style="color: rgba(0, 0, 0, 1)"> AParity;
</span><span style="color: rgba(0, 128, 128, 1)"> 926</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 927</span>
<span style="color: rgba(0, 128, 128, 1)"> 928</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropDataBits(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ADataBits: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 929</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 930</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> TDataBitsTool.IsSupportedDataBits(ADataBits) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 931</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Unsupported dataBits %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 932</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 933</span>
<span style="color: rgba(0, 128, 128, 1)"> 934</span> self.FDataBits :=<span style="color: rgba(0, 0, 0, 1)"> ADataBits;
</span><span style="color: rgba(0, 128, 128, 1)"> 935</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 936</span>
<span style="color: rgba(0, 128, 128, 1)"> 937</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropStopBit(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AStopBit: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 938</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 939</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(0, 0, 255, 1)">not</span> TStopBitTool.IsSupportedStopBit(AStopBit) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 940</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Unsupported stopBit %d</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 941</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 942</span>
<span style="color: rgba(0, 128, 128, 1)"> 943</span> self.FStopBit :=<span style="color: rgba(0, 0, 0, 1)"> AStopBit;
</span><span style="color: rgba(0, 128, 128, 1)"> 944</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 945</span>
<span style="color: rgba(0, 128, 128, 1)"> 946</span>
<span style="color: rgba(0, 128, 128, 1)"> 947</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropReadTimeOut(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ATimeOut: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 948</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置读超时</span>
<span style="color: rgba(0, 128, 128, 1)"> 949</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> timeout == 0 表示不使用超时, 无论有没有数据总是立即返回</span>
<span style="color: rgba(0, 128, 128, 1)"> 950</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 951</span> <span style="color: rgba(0, 0, 0, 1)">LOldTimeout : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 952</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 953</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ATimeOut < <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 954</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ReadTimeout %d out of range, timeout can not less than 0.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 955</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 956</span>
<span style="color: rgba(0, 128, 128, 1)"> 957</span> LOldTimeOut :=<span style="color: rgba(0, 0, 0, 1)"> self.FReadTimeOut;
</span><span style="color: rgba(0, 128, 128, 1)"> 958</span> <span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 128, 1)"> 959</span> self.FReadTimeOut :=<span style="color: rgba(0, 0, 0, 1)"> ATimeOut;
</span><span style="color: rgba(0, 128, 128, 1)"> 960</span>
<span style="color: rgba(0, 128, 128, 1)"> 961</span> <span style="color: rgba(0, 0, 255, 1)">if</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 962</span> <span style="color: rgba(0, 0, 0, 1)"> self.ConfigTimeouts();
</span><span style="color: rgba(0, 128, 128, 1)"> 963</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 964</span> <span style="color: rgba(0, 0, 255, 1)">except</span>
<span style="color: rgba(0, 128, 128, 1)"> 965</span> self.FReadTimeOut :=<span style="color: rgba(0, 0, 0, 1)"> LOldTimeout;
</span><span style="color: rgba(0, 128, 128, 1)"> 966</span> <span style="color: rgba(0, 0, 255, 1)">raise</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 967</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 968</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 969</span>
<span style="color: rgba(0, 128, 128, 1)"> 970</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropWriteTimeOut(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ATimeOut: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 971</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置写超时</span>
<span style="color: rgba(0, 128, 128, 1)"> 972</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> timeout == 0 表示不使用写超时</span>
<span style="color: rgba(0, 128, 128, 1)"> 973</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 974</span> <span style="color: rgba(0, 0, 0, 1)">LOldTimeOut : Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 975</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 976</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ATimeOut < <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 977</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.CreateFmt(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ReadTimeout %d out of range, timeout can not less than 0.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, );
</span><span style="color: rgba(0, 128, 128, 1)"> 978</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 979</span>
<span style="color: rgba(0, 128, 128, 1)"> 980</span> LOldTimeOut :=<span style="color: rgba(0, 0, 0, 1)"> self.FWriteTimeOut;
</span><span style="color: rgba(0, 128, 128, 1)"> 981</span> <span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 128, 1)"> 982</span> self.FWriteTimeOut :=<span style="color: rgba(0, 0, 0, 1)"> ATimeOut;
</span><span style="color: rgba(0, 128, 128, 1)"> 983</span>
<span style="color: rgba(0, 128, 128, 1)"> 984</span> <span style="color: rgba(0, 0, 255, 1)">if</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 985</span> <span style="color: rgba(0, 0, 0, 1)"> self.ConfigTimeouts();
</span><span style="color: rgba(0, 128, 128, 1)"> 986</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 987</span> <span style="color: rgba(0, 0, 255, 1)">except</span>
<span style="color: rgba(0, 128, 128, 1)"> 988</span> self.FWriteTimeOut :=<span style="color: rgba(0, 0, 0, 1)"> LOldTimeout;
</span><span style="color: rgba(0, 128, 128, 1)"> 989</span> <span style="color: rgba(0, 0, 255, 1)">raise</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 990</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 991</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 992</span>
<span style="color: rgba(0, 128, 128, 1)"> 993</span>
<span style="color: rgba(0, 128, 128, 1)"> 994</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropReadBufferSize(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ASize: Integer);
</span><span style="color: rgba(0, 128, 128, 1)"> 995</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置 读缓冲区</span>
<span style="color: rgba(0, 128, 128, 1)"> 996</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 997</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ASize <= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)"> 998</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ReadBufferSize must greater than 0.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 999</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1000</span>
<span style="color: rgba(0, 128, 128, 1)">1001</span> <span style="color: rgba(0, 0, 255, 1)">if</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1002</span> <span style="color: rgba(0, 0, 255, 1)">raise</span>ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ReadBufferSize cannot be set while the port is open.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">1003</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1004</span>
<span style="color: rgba(0, 128, 128, 1)">1005</span> self.FReadBufferSize :=<span style="color: rgba(0, 0, 0, 1)"> ASize;
</span><span style="color: rgba(0, 128, 128, 1)">1006</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1007</span>
<span style="color: rgba(0, 128, 128, 1)">1008</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span> TSerialPort.SetPropWriteBufferSize(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ASize: Integer);
</span><span style="color: rgba(0, 128, 128, 1)">1009</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置 写缓冲区</span>
<span style="color: rgba(0, 128, 128, 1)">1010</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1011</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (ASize <= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1012</span> <span style="color: rgba(0, 0, 255, 1)">raise</span> ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">WriteBufferSize must greater than 0.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">1013</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1014</span>
<span style="color: rgba(0, 128, 128, 1)">1015</span> <span style="color: rgba(0, 0, 255, 1)">if</span> self.IsOpen() <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1016</span> <span style="color: rgba(0, 0, 255, 1)">raise</span>ESerialPort.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">WriteBufferSize cannot be set while the port is open.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">1017</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1018</span>
<span style="color: rgba(0, 128, 128, 1)">1019</span> self.FWriteBufferSize :=<span style="color: rgba(0, 0, 0, 1)"> ASize;
</span><span style="color: rgba(0, 128, 128, 1)">1020</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1021</span>
<span style="color: rgba(0, 128, 128, 1)">1022</span>
<span style="color: rgba(0, 128, 128, 1)">1023</span>
<span style="color: rgba(0, 128, 128, 1)">1024</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- TSerialPort.TEventLoop ---</span>
<span style="color: rgba(0, 128, 128, 1)">1025</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO</span>
<span style="color: rgba(0, 128, 128, 1)">1026</span>
<span style="color: rgba(0, 128, 128, 1)">1027</span> <span style="color: rgba(0, 0, 255, 1)">constructor</span> TSerialPort.TEventLoop.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(AHandle : THandle);
</span><span style="color: rgba(0, 128, 128, 1)">1028</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1029</span> <span style="color: rgba(0, 0, 255, 1)">inherited</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)">1030</span>
<span style="color: rgba(0, 128, 128, 1)">1031</span> self.FHandle :=<span style="color: rgba(0, 0, 0, 1)"> AHandle;
</span><span style="color: rgba(0, 128, 128, 1)">1032</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO</span>
<span style="color: rgba(0, 128, 128, 1)">1033</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1034</span>
<span style="color: rgba(0, 128, 128, 1)">1035</span> <span style="color: rgba(0, 0, 255, 1)">destructor</span> TSerialPort.TEventLoop.<span style="color: rgba(0, 0, 255, 1)">Destroy</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1036</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1037</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO</span>
<span style="color: rgba(0, 128, 128, 1)">1038</span>
<span style="color: rgba(0, 128, 128, 1)">1039</span> <span style="color: rgba(0, 0, 255, 1)">inherited</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1040</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1041</span>
<span style="color: rgba(0, 128, 128, 1)">1042</span>
<span style="color: rgba(0, 128, 128, 1)">1043</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.TEventLoop.Start();
</span><span style="color: rgba(0, 128, 128, 1)">1044</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1045</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO</span>
<span style="color: rgba(0, 128, 128, 1)">1046</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1047</span>
<span style="color: rgba(0, 128, 128, 1)">1048</span>
<span style="color: rgba(0, 128, 128, 1)">1049</span> <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TSerialPort.TEventLoop.Stop();
</span><span style="color: rgba(0, 128, 128, 1)">1050</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1051</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO</span>
<span style="color: rgba(0, 128, 128, 1)">1052</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1053</span>
<span style="color: rgba(0, 128, 128, 1)">1054</span>
<span style="color: rgba(0, 128, 128, 1)">1055</span>
<span style="color: rgba(0, 128, 128, 1)">1056</span>
<span style="color: rgba(0, 128, 128, 1)">1057</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- unit private sequential search ---</span>
<span style="color: rgba(0, 128, 128, 1)">1058</span>
<span style="color: rgba(0, 128, 128, 1)">1059</span> <span style="color: rgba(0, 0, 255, 1)">function</span> Contains(<span style="color: rgba(0, 0, 255, 1)">const</span> AItem : Integer; <span style="color: rgba(0, 0, 255, 1)">const</span> AArray : <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Integer) : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)">1060</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)">1061</span> <span style="color: rgba(0, 0, 0, 1)">LElem : Integer;
</span><span style="color: rgba(0, 128, 128, 1)">1062</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1063</span> <span style="color: rgba(0, 0, 255, 1)">for</span> LElem <span style="color: rgba(0, 0, 255, 1)">in</span> AArray <span style="color: rgba(0, 0, 255, 1)">do</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1064</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (AItem = LElem) <span style="color: rgba(0, 0, 255, 1)">then</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1065</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> True;
</span><span style="color: rgba(0, 128, 128, 1)">1066</span> <span style="color: rgba(0, 0, 0, 1)"> Exit;
</span><span style="color: rgba(0, 128, 128, 1)">1067</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1068</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1069</span>
<span style="color: rgba(0, 128, 128, 1)">1070</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> False;
</span><span style="color: rgba(0, 128, 128, 1)">1071</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1072</span>
<span style="color: rgba(0, 128, 128, 1)">1073</span>
<span style="color: rgba(0, 128, 128, 1)">1074</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- TBaudRateTool ---</span>
<span style="color: rgba(0, 128, 128, 1)">1075</span>
<span style="color: rgba(0, 128, 128, 1)">1076</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TBaudRateTool.IsSupportedBaudRate(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ABaudRate : Integer) : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)">1077</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1078</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> Contains(ABaudRate, SupportedValues);
</span><span style="color: rgba(0, 128, 128, 1)">1079</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1080</span>
<span style="color: rgba(0, 128, 128, 1)">1081</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- TPairtyTool ---</span>
<span style="color: rgba(0, 128, 128, 1)">1082</span>
<span style="color: rgba(0, 128, 128, 1)">1083</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TParityTool.IsSupportedParity(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AParity : Integer) : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)">1084</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1085</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> Contains(AParity, SupportedValues);
</span><span style="color: rgba(0, 128, 128, 1)">1086</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1087</span>
<span style="color: rgba(0, 128, 128, 1)">1088</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- TDataBitsTool ---</span>
<span style="color: rgba(0, 128, 128, 1)">1089</span>
<span style="color: rgba(0, 128, 128, 1)">1090</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TDataBitsTool.IsSupportedDataBits(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> ADataBits : Integer) : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)">1091</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1092</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> Contains(ADataBits, SupportedValues);
</span><span style="color: rgba(0, 128, 128, 1)">1093</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1094</span>
<span style="color: rgba(0, 128, 128, 1)">1095</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> --- TStopBitTool ---</span>
<span style="color: rgba(0, 128, 128, 1)">1096</span>
<span style="color: rgba(0, 128, 128, 1)">1097</span> <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span> TStopBitTool.IsSupportedStopBit(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AStopBit : Integer) : Boolean;
</span><span style="color: rgba(0, 128, 128, 1)">1098</span> <span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 128, 1)">1099</span> Result :=<span style="color: rgba(0, 0, 0, 1)"> Contains(AStopBit, SupportedValues);
</span><span style="color: rgba(0, 128, 128, 1)">1100</span> <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">1101</span>
<span style="color: rgba(0, 128, 128, 1)">1102</span>
<span style="color: rgba(0, 128, 128, 1)">1103</span> <span style="color: rgba(0, 0, 255, 1)">end</span>.</pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>--------- THE END ---------</p><br><br>
来源:https://www.cnblogs.com/shadow-abyss/p/12585696.html
頁:
[1]