现在想让下位机发送的角度能实时传输,上位机界面是由JavaScript写的,代码如下。
//发送和接收角度实时传输
const update = async function () {
// 进入定时器
console.log('进入定时器')
if (isBusy) {
clearInterval(timer1)
return
}
try {
const reader2 = port!.readable!.getReader()
const getCheck1 = (...arr: number[]) => {
let sum = 0
for (let i = 0; i < arr.length; i++) {
sum = (sum + arr[i]) & 0xff
}
return sum & 0xff
}
let data = Uint8Array.of(0xf0, 0x03, 0x05, getCheck1(0xf0, 0x03, 0x05), 0x0f)
await writer?.ready
await writer?.write(data)
console.log('write success')
let res = (await reader2!.read()).value!
console.log(res)
上位机发给下位机的帧是F0 03 04 F7 0F,下位机回应的角度值的帧正常情况是这样
有时会出现这个情况
帧头和后面的部分分成两次传输了,是为什么呢?一直没有弄明白这个部分,求大神指点!!
问题已解决
串口通信的弊端,有时候串口通信并不能一次将帧给发完,需要一个缓冲区,判断帧是否是完整的,再传输 。
//发送和接收角度实时传输
const update = async function () {
// 进入定时器
console.log('进入定时器')
console.log('值' + isBusy)
try {
const reader2 = port!.readable!.getReader()
const getCheck1 = (...arr: number[]) => {
let sum = 0
for (let i = 0; i < arr.length; i++) {
sum = (sum + arr[i]) & 0xff
}
return sum & 0xff
}
let data = Uint8Array.of(0xf0, 0x03, 0x05, getCheck1(0xf0, 0x03, 0x05), 0x0f)
await writer?.ready
await writer?.write(data)
console.log('write success')
let res = new Uint8Array(7)
let res1 = (await reader2!.read()).value!
for (let i = 0; i < res1.length; i++) {
res[i] = res1[i]
}
let j = res1.length
console.log('实时传输帧为:', res1)
console.log('实时传输帧为:', res)
while (res[res.length - 1] !== 15) {
let res2 = (await reader2!.read()).value!
console.log('res2:', res2)
for (let i = 0; i < res2.length; i++) {
res[j] = res2[i]
j++
}
console.log('实时传输帧为:', res)
}