對串列埠接受到的負數資料進行處理

2021-10-17 20:09:07 字數 4770 閱讀 2853

因為要做乙個電容感測器的專案,寫了乙個簡單的串列埠通訊,但是觀察串列埠資料的時候發現了乙個問題,負數資料讀不到,所以根據這一問題又修改了**如下。

# singed_bin2dec.py

import os, sys, re

defint_convert

(data,width):if

(data >2**

(width -1)

-1):

data = data -

2** width

return data

a =255

b =65535

print

(int_convert(a,8)

)print

(int_convert(b,16)

)

簡易的串列埠接收資料並且放入**

#coding:utf-8              #由於.py檔案是utf-8的,所以必須有這一句

import os

import csv

import time

import serial # pyserial

import serial.tools.list_ports

import os, sys, re

i***ist = os.path.exists(

'./data')if

not i***ist:

#判斷是否存在資料夾如果不存在則建立為資料夾

os.makedirs(

'./data'

)# makedirs 建立檔案時如果路徑不存在會建立這個路徑

with

open

('./data/result.csv'

,'w'

, newline='')

as table:

csv_write = csv.writer(table)

csv_row =

['time'

,'b'

,'bref'

,'aref'

,'dd1'

,'dd2'

]# 定義表頭

#print(csv_row)

csv_write.writerow(csv_row)

print

("請選擇串列埠選擇方式:\n"

+"1.自動選擇\n"

+"2.手動選擇"

)mode =

int(

input

("請根據需求輸入」1「或者」2「進行選擇:\n"),

10)try:

# 埠:cnu; linux上的/dev/ttyusb0等; windows上的com3等

port_list =

list

(serial.tools.list_ports.comports())

iflen

(port_list)==0

:print

('找不到串列埠'

) exit(

)else

:print

('識別到當前計算機中的串列埠:'

)for i in

range(0

,len

(port_list)):

print

(str

(i +1)

+':'

+str

(port_list[i]))

#print(port_list[i])if(

"ch340"

instr

(port_list[i]))

: ch340 =

str(port_list[i])if

(mode ==1)

: ch340 = ch340[0:

5].rstrip(

)#刪除字串末尾的空格

print

('已經自動選擇:'

+ ch340)

elif

(mode ==2)

: ch340 =

input

("請輸入需要使用的串列埠:\n"

) portx = ch340

# 波特率,標準值有:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200

bps =

57600

# 超時設定,none:永遠等待操作;

# 0:立即返回請求結果;

# 其他:等待超時時間(單位為秒)

timex =

none

# 開啟串列埠,並得到串列埠物件

ser = serial.serial(portx, bps, timeout=timex)

print

("串列埠詳情引數:"

, ser)

# # 十六進製制的傳送

# result = ser.write(chr(0x06).encode("utf-8")) # 寫資料

# print("寫總位元組數:", result)

# 十六進製制的讀取

#i = 0

# data1 = 1

# data2 = 1

# data3 = 1

# data4 = 1

# data5 = 0

# data6 = 0

# data7 = 0

# data8 = 0

# data9 = 0

ct_start =

int(time.time()*

10)defint_convert

(data, width):if

(data >2**

(width -1)

-1):

data = data -

2** width

return data

while(1

):#i+=1

data1 =

int(ser.read().

hex(),

16)# b鍵低位元組

data2 =

int(ser.read().

hex(),

16)# b鍵高位元組

data3 =

int(ser.read().

hex(),

16)# b參考低位元組

data4 =

int(ser.read().

hex(),

16)# b參考高位元組

data5 =

int(ser.read().

hex(),

16)# a參考低位元組

data6 =

int(ser.read().

hex(),

16)# a參考高位元組

data7 =

int(ser.read().

hex(),

16)# dd1低位元組

data8 =

int(ser.read().

hex(),

16)# dd1高位元組

data9 =

int(ser.read().

hex(),

16)# dd2低位元組

data10 =

int(ser.read().

hex(),

16)# dd2高位元組

t1 = data1 + data2 *

256 t2 = data3 + data4 *

256 t3 = data5 + data6 *

256 t4 = data7 + data7 *

256 t5 = data9 + data10 *

256 t1 = int_convert(t1,16)

t2 = int_convert(t2,16)

t3 = int_convert(t3,16)

t4 = int_convert(t4,16)

t5 = int_convert(t5,16)

ct_current =

int(time.time()*

10)time_count_100ms = ct_current - ct_start

# print(int_convert(a, 8))

# print(int_convert(b, 16))

with

open

('./data/result.csv'

,'a'

, newline='')

as table:

csv_write = csv.writer(table)

#csv_row = ['t','r','b','d','s','th','ct']

#print(csv_row)

csv_row =

[time_count_100ms, t1, t2, t3, t4, t5]

print

(csv_row)

csv_write.writerow(csv_row)

print

("----------"

) ser.close(

)# 關閉串列埠

except exception as e:

print

("error!"

, e)

希望可以對大家有所幫助。

對串列埠傳送的訊息進行處理後返回

例如傳送 ohmygod 返回 d o g y m h o 雖然筆者也不知道介個有啥用,但也是為了初學串列埠後加深理解的小例程吧。輸入的字串要與定義的陣列長度相同,也就是說此 是針對字串長度為9的,可根據自己所需進行調整 include typedef unsigned int u16 typede...

對百萬級txt檔案的資料,進行查重處理

需求1 比對a b兩個檔案,其中a檔案是b檔案的一部分,找出a b檔案的差集。使用hashset 分別儲存要比對的資料,然後求差集,主要 如下 using system using system.collections.generic using system.linq using system.t...

對介面中的資料進行處理,重組成新陣列

專案中經常需要將介面中的資料進行處理,得到自己想要的格式。下面是將介面中的資料重組成乙個新陣列的方法 介面資料 data中資料 data 普通方法 新陣列,用來裝資料 var newarr 通過map方法將原始陣列中的每一項迴圈 res.list.map function item,index 給每...