@@ -2,23 +2,6 @@ function delay(ms) {
22 return new Promise ( resolve => setTimeout ( resolve , ms ) ) ;
33}
44
5- class LineBreakTransformer {
6- constructor ( ) {
7- this . chunks = "" ;
8- }
9-
10- transform ( chunk , controller ) {
11- this . chunks += chunk ;
12- const lines = this . chunks . split ( "\n" ) ;
13- this . chunks = lines . pop ( ) ;
14- lines . forEach ( ( line ) => controller . enqueue ( line ) ) ;
15- }
16-
17- flush ( controller ) {
18- controller . enqueue ( this . chunks ) ;
19- }
20- }
21-
225class SerialReadWrite {
236 constructor ( port , baudrate ) {
247 this . port = port ;
@@ -36,6 +19,47 @@ class SerialReadWrite {
3619 await this . port . close ( ) ;
3720 }
3821
22+ async readBytes ( retryError = 5 , errorNum = 0 ) {
23+ let reader = undefined ;
24+
25+ if ( this . isPortOpen === false ) {
26+ await this . openPort ( ) ;
27+ this . isPortOpen = true ;
28+ }
29+
30+ try {
31+ if ( reader === undefined ) {
32+ reader = this . port . readable . getReader ( ) ;
33+ }
34+
35+ const promiseResult = await reader . read ( ) ;
36+
37+ if ( promiseResult === undefined ) {
38+ return undefined ;
39+ }
40+
41+ return promiseResult . value ;
42+ } catch ( e ) {
43+ if ( e instanceof DOMException &&
44+ ( e . name === "BreakError" || e . name === "FramingError" || e . name === "ParityError" ) ) {
45+ console . log ( e ) ;
46+
47+ if ( errorNum > retryError ) {
48+ throw e ;
49+ }
50+
51+ return await this . readBytes ( retryError , errorNum ++ ) ;
52+ } else {
53+ throw e ;
54+ }
55+ } finally {
56+ if ( reader ) {
57+ reader . releaseLock ( ) ;
58+ reader = undefined ;
59+ }
60+ }
61+ }
62+
3963 async readLine ( readCallback , timeout = undefined ) {
4064 let reader = undefined ;
4165 let extraChunk = "" ;
@@ -90,7 +114,7 @@ class SerialReadWrite {
90114 }
91115 }
92116
93- async writeString ( str ) {
117+ async writeBytes ( bytes ) {
94118 let writer = undefined ;
95119
96120 if ( this . isPortOpen === false ) {
@@ -103,46 +127,16 @@ class SerialReadWrite {
103127 writer = this . port . writable . getWriter ( ) ;
104128 }
105129
106- writer . write ( this . textEncoder . encode ( str ) ) ;
130+ writer . write ( bytes ) ;
107131 } finally {
108132 if ( writer ) {
109133 writer . releaseLock ( ) ;
110134 writer = undefined ;
111135 }
112136 }
113137 }
114- }
115-
116- async function openPortLineBreak ( port , baudRate ) {
117- await port . open ( { baudRate : baudRate } ) ;
118- const textDecoder = new TextDecoderStream ( ) ;
119- const readableStreamClosed = port . readable . pipeTo ( textDecoder . writable ) ;
120- const reader = await textDecoder . readable . pipeThrough ( new TransformStream ( new LineBreakTransformer ( ) ) ) . getReader ( ) ;
121- const textEncoderStream = new TextEncoderStream ( ) ;
122- const writerStreamClosed = textEncoderStream . readable . pipeTo ( port . writable ) ;
123- const writer = await textEncoderStream . writable . getWriter ( ) ;
124-
125- return { reader, writer, readableStreamClosed, writerStreamClosed } ;
126- }
127-
128- async function closePortLineBreak ( port , reader , writer , readableStreamClosed , writerStreamClosed ) {
129- if ( reader ) {
130- reader . cancel ( ) ;
131- }
132-
133- if ( readableStreamClosed ) {
134- await readableStreamClosed . catch ( ( ) => { /* Ignore the error */ } ) ;
135- }
136138
137- if ( writer ) {
138- writer . close ( ) ;
139- }
140-
141- if ( writerStreamClosed ) {
142- await writerStreamClosed ;
143- }
144-
145- if ( port ) {
146- await port . close ( ) ;
139+ async writeString ( str ) {
140+ await this . writeBytes ( this . textEncoder . encode ( str ) ) ;
147141 }
148142}
0 commit comments