• 035——从GUI->Client->Server->driver实现SPI控制DAC芯片


    目录

    1、修改GUI

    2、修改client

    3、server编写

    4、driver_handle

    5、test

    6、 项目管理


    1、修改GUI

    我想让DAC控制是个滑动条

    1. import PySimpleGUI as sg
    2. def slider_callback(slider_value):
    3. print(f'Current value: {slider_value}')
    4. layout = [
    5. [sg.Text('Select a value:')],
    6. [sg.Slider(range=(1, 100), orientation='h', size=(20, 15), default_value=50, key='-SLIDER-', enable_events=True)],
    7. [sg.Button('OK')]
    8. ]
    9. window = sg.Window('Slider Example', layout)
    10. while True:
    11. event, values = window.read()
    12. if event == 'Close' or event == 'OK':
    13. break
    14. elif event == '-SLIDER-':
    15. slider_value = values['-SLIDER-']
    16. slider_callback(slider_value)
    17. window.close()

     

    现在滑动条的event可以获取了但是有个问题就是和后面DAC之间匹配不上,太丑啦

    1. import PySimpleGUI as sg
    2. layout = [
    3. [sg.Text('居中对齐', size=(10, 1), justification='c', pad=(10, 5))], # 水平和垂直填充,居中对齐
    4. [sg.Text('左对齐偏下', size=(10, 1), justification='l', pad=((10, 0), (5, 0)))], # 上边填充使文本偏下,左对齐
    5. [sg.Text('右对齐偏下', size=(10, 1), justification='r', pad=((0, 10), (5, 0)))], # 上边填充使文本偏下,右对齐
    6. ]
    7. window = sg.Window('文本对齐示例', layout)
    8. while True:
    9. event, values = window.read()
    10. if event == sg.WIN_CLOSED:
    11. break
    12. window.close()

    分开测试都好使,放在一起就不行,里普瓦

    好像可以,之前给的值太小了导致看不出来,给了个20现在看着还算是协调

    1. '''
    2. fuction : 客户端界面
    3. author : 辛天宇
    4. date : 2024-4-12
    5. -------------------------------
    6. author date modify
    7. '''
    8. import PySimpleGUI as sg
    9. import tool
    10. import global_var
    11. # 调用显示框架
    12. def show_window(theme):
    13. # 是否使用自定义标题栏
    14. use_custom_titlebar = False
    15. # 设置主题
    16. sg.theme(theme)
    17. # 创建菜单
    18. Menu = sg.Menu
    19. # 左部layout
    20. layout_l = [
    21. [tool.name('NetWork'), sg.Button('Connect', key='Connect')],
    22. [tool.name('NetWork'), sg.Button('Disconnect', key='Disconnect')],
    23. [tool.name('NetWork'), sg.Output(size=(32, 1), key='IP')],
    24. [sg.Checkbox('Input', use_custom_titlebar, enable_events=True, key='input')],
    25. [sg.InputText(disabled=True, key='txbuff'), sg.Button('SEND', key='send')],
    26. [sg.Slider(range=(0, 100), orientation='h', size=(29, 20), default_value=0, key='DAC', enable_events=True), sg.Text('DAC', size=(5,2), justification='c',pad=(0,(20,0)), font='Courier 14')],
    27. [sg.InputText(key='AT24C02_I', default_text=''), sg.Button('AT24C02 WRITE', key='AT24C02_W')],
    28. ]
    29. # 右部layout
    30. layout_r = [
    31. [sg.Output(size=(16, 1), key='LED_O'), sg.Button('LED', key='LED')],
    32. [sg.Output(size=(16, 1), key='SR501_O'), sg.Button('SR501', key='SR501')],
    33. [sg.Output(size=(16, 1), key='SR04_O'), sg.Button('SR04', key='SR04')],
    34. [sg.Output(size=(16, 1), key='IRDA_O'), sg.Button('IRDA', key='IRDA')],
    35. [sg.Output(size=(16, 1), key='DHT11_O'), sg.Button('DHT11', key='dht11')],
    36. [sg.Output(size=(16, 1), key='DS18B20_O'), sg.Button('DS18B20', key='ds18b20')],
    37. [sg.Output(size=(16, 1), key='AT24C02_O'), sg.Button('AT24C02 READ', key='AT24C02_R')],
    38. #[tool.name('Text'), sg.Button('IIC', key='IIC')],
    39. ]
    40. # 修饰
    41. topic = tool.add_stars_to_string(global_var.TOPIC, 5)
    42. # 设置字体为14号,无特殊样式,通常字体名称和大小用元组表示
    43. topic_font = ('_', 24)
    44. # 整体layout
    45. layout = [
    46. [sg.T(topic, text_color='blue', justification='c', font=topic_font)],
    47. [sg.Col(layout_l), sg.Col(layout_r)],
    48. [sg.Text('Output:', size=(7,1), justification='r',pad=(0,0), font='Courier 10'),],
    49. [sg.Output(size=(96, 8), key='Output')],
    50. [sg.Button('Clean', key='Clean'), sg.Button('Quit', key='Quit')]
    51. ]
    52. window = sg.Window('The PySimpleGUI Element List', layout, finalize=True, keep_on_top=True)
    53. return window
    54. # 处理事件
    55. def event_handle():
    56. window = show_window('DefaultNoMoreNagging')
    57. # 事件循环
    58. while True:
    59. try:
    60. event, values = window.read()
    61. if event == 'Exit':
    62. break
    63. if event == 'dht11':
    64. message = f"{global_var.TEM}°C {global_var.HUM}%"
    65. window['Getvalue'].update(message)
    66. if event == 'ds18b20':
    67. message = f"{global_var.TEM}°C"
    68. window['Getvalue'].update(message)
    69. if event == 'input':
    70. print(f"INPUT-----------------")
    71. elif event == 'Quit':
    72. print(f"See you.............")
    73. break
    74. # elif event == 'Connect':
    75. # global_var.SERVER_IP = "192.168.5.10"
    76. # window['IP'].update(global_var.SERVER_IP)
    77. # elif event == 'Disconnect':
    78. # global_var.SERVER_IP = "connectionless network service"
    79. # window['IP'].update(global_var.SERVER_IP)
    80. elif event is None:
    81. print(f"xxxxxxxxxxxxxxxxxxxx")
    82. break
    83. elif event == 'LED':
    84. print(f"LED-----------------")
    85. # 处理其他事件...
    86. except Exception as e:
    87. window.close()
    88. print(f"An error occurred: {e}")
    89. return 0
    90. window.close()
    91. return 0
    92. def main():
    93. # theme参考/client/README
    94. event_handle()
    95. if __name__ == '__main__':
    96. main()

    2、修改client

    1. '''
    2. fuction : 客户端程序
    3. author : 辛天宇
    4. date : 2024-4-13
    5. -------------------------------
    6. author date modify
    7. 辛天宇 2024-4-15 结合GUI和网络通信
    8. '''
    9. import show
    10. import tcp
    11. import tool
    12. import socket
    13. import global_var
    14. def send_handle(window, client_socket, values):
    15. global_var.TX_BUF = values['txbuff']
    16. print(f"txbuff={global_var.TX_BUF}")
    17. # 清理input
    18. window['txbuff'].update(value='')
    19. data = global_var.TX_BUF
    20. client_socket.sendall(data.encode())
    21. # 接收服务器的响应
    22. data = client_socket.recv(512)
    23. # 将字节字符串转化为字符串
    24. global_var.RX_BUF = data.decode('utf-8')
    25. # print(f"rx......{global_var.RX_BUF}")
    26. def quit_handel(client_socket):
    27. cmd='Q'
    28. client_socket.sendall(cmd.encode())
    29. tcp.disconnect_to_server(client_socket)
    30. def motor_handel(window, client_socket, values):
    31. i = int(values['MOTOR_I'])
    32. global_var.MOTOR_DATA = str(abs(i)%360)
    33. if i >= 0:
    34. global_var.MOTOR_DIRECTION='0'
    35. else:
    36. global_var.MOTOR_DIRECTION='1'
    37. message = 's'+global_var.MOTOR_DIRECTION+global_var.MOTOR_DATA
    38. # 清理input
    39. window['MOTOR_I'].update(value='0')
    40. set_tx_buf('motor', message)
    41. send_cmd(client_socket)
    42. # 接收服务器的响应
    43. data = client_socket.recv(512)
    44. # 将字节字符串转化为字符串
    45. global_var.RX_BUF = data.decode('utf-8')
    46. # print(f"rx......{global_var.RX_BUF}")
    47. # 进行一次发送
    48. def send_cmd(client_socket):
    49. data = global_var.TX_BUF
    50. client_socket.sendall(data.encode())
    51. # 接收服务器的响应
    52. data = client_socket.recv(512)
    53. # 将字节字符串转化为字符串
    54. global_var.RX_BUF = data.decode('utf-8')
    55. # print(f"rx......{global_var.RX_BUF}")
    56. # 设置发送消息
    57. def set_tx_buf(device, message):
    58. if device == 'sr04':
    59. global_var.TX_BUF = '@002'+message
    60. if device == 'led':
    61. global_var.TX_BUF = '@000'+message
    62. elif device == 'sr501':
    63. global_var.TX_BUF = '@001'+message
    64. elif device == 'irda':
    65. global_var.TX_BUF = '@003'+message
    66. elif device == 'motor':
    67. global_var.TX_BUF = '@004'+message
    68. elif device == 'dht11':
    69. global_var.TX_BUF = '@005'+message
    70. elif device == 'ds18b20':
    71. global_var.TX_BUF = '@006'+message
    72. elif device == 'AT24C02':
    73. global_var.TX_BUF = '@007'+message
    74. elif device == 'dac':
    75. global_var.TX_BUF = '@008'+message
    76. # 解析IRDA传入的数据
    77. def irda_data_analysis(cmd):
    78. if cmd[5] == 'r':
    79. global_var.IRDA_DATA = "RED"
    80. elif cmd[5] == 'm':
    81. global_var.IRDA_DATA = "MENU"
    82. elif cmd[5] == 't':
    83. global_var.IRDA_DATA = "TEST"
    84. elif cmd[5] == '+':
    85. global_var.IRDA_DATA = "+"
    86. elif cmd[5] == 'b':
    87. global_var.IRDA_DATA = "BACK"
    88. elif cmd[5] == 'l':
    89. global_var.IRDA_DATA = "LEFT"
    90. elif cmd[5] == 'p':
    91. global_var.IRDA_DATA = "START"
    92. elif cmd[5] == 'r':
    93. global_var.IRDA_DATA = "RIGHT"
    94. elif cmd[5] == '0':
    95. global_var.IRDA_DATA = "0"
    96. elif cmd[5] == '1':
    97. global_var.IRDA_DATA = "1"
    98. elif cmd[5] == '2':
    99. global_var.IRDA_DATA = "2"
    100. elif cmd[5] == '-':
    101. global_var.IRDA_DATA = "-"
    102. elif cmd[5] == 'c':
    103. global_var.IRDA_DATA = "c"
    104. elif cmd[5] == '3':
    105. global_var.IRDA_DATA = "3"
    106. elif cmd[5] == '4':
    107. global_var.IRDA_DATA = "4"
    108. elif cmd[5] == '5':
    109. global_var.IRDA_DATA = "5"
    110. elif cmd[5] == '6':
    111. global_var.IRDA_DATA = "6"
    112. elif cmd[5] == '7':
    113. global_var.IRDA_DATA = "7"
    114. elif cmd[5] == '8':
    115. global_var.IRDA_DATA = "8"
    116. elif cmd[5] == '9':
    117. global_var.IRDA_DATA = "9"
    118. # 处理数据
    119. def cmd_handle(window):
    120. cmd = global_var.RX_BUF
    121. global_var.RX_BUF="#000"
    122. if len(cmd) < 4:
    123. print("cmd ERROR")
    124. return -1
    125. if '@' == cmd[0]:
    126. # 目前驱动设备数量只有两位数
    127. if cmd[1] == '0':
    128. # LED: @000+1位命令位+1位数据位
    129. if cmd[2] == '0' and cmd[3] == '0':
    130. if cmd[5] == '1':
    131. print("LED Status change success")
    132. elif cmd[5] == '0':
    133. print("LED Status change failure")
    134. else:
    135. print("message ERROR")
    136. # SR501:@001+1位数据位
    137. elif cmd[2] == '0' and cmd[3] == '1':
    138. if cmd[5] == '1':
    139. print("有人")
    140. message='有人'
    141. window['SR501_O'].update(message)
    142. elif cmd[5] == '0':
    143. print("无人")
    144. message='无人'
    145. window['SR501_O'].update(message)
    146. else:
    147. print("message ERROR")
    148. # SR04
    149. elif cmd[2] == '0' and cmd[3] == '2':
    150. if cmd[4] == 'g':
    151. global_var.SR04_DATA = cmd[5:8]
    152. message = f"{global_var.SR04_DATA}cm"
    153. window['SR04_O'].update(message)
    154. else:
    155. print("SR04: message ERROR")
    156. # irda
    157. elif cmd[2] == '0' and cmd[3] == '3':
    158. # message = cmd[5]
    159. # print(message)
    160. if cmd[4] == 'g':
    161. irda_data_analysis(cmd)
    162. window['IRDA_O'].update(global_var.IRDA_DATA)
    163. # motor
    164. elif cmd[2] == '0' and cmd[3] == '4':
    165. if cmd[4] == 's':
    166. print("MOTOR: message SCUESS")
    167. else:
    168. print("MOTOR: message ERROR")
    169. # dht11
    170. elif cmd[2] == '0' and cmd[3] == '5':
    171. if cmd[4] == 'g':
    172. try:
    173. global_var.TEM=cmd[5]+cmd[6]
    174. global_var.HUM=cmd[7]+cmd[8]
    175. message = f"{global_var.TEM}°C {global_var.HUM}%"
    176. window['DHT11_O'].update(message)
    177. except:
    178. message = "ERROR"
    179. window['DHT11_O'].update(message)
    180. print("DHT11: message ERROR")
    181. else:
    182. message = "ERROR"
    183. window['DHT11_O'].update(message)
    184. print("DHT11: message ERROR")
    185. # ds18b20
    186. elif cmd[2] == '0' and cmd[3] == '6':
    187. if cmd[4] == 'g':
    188. try:
    189. global_var.TEM=cmd[5]+cmd[6]
    190. message = f"{global_var.TEM}°C"
    191. window['DS18B20_O'].update(message)
    192. except:
    193. message = "ERROR"
    194. window['DS18B20_O'].update(message)
    195. print("DS18B20: message ERROR")
    196. else:
    197. message = "ERROR"
    198. window['DS18B20_O'].update(message)
    199. print("DS18B20: message ERROR")
    200. # AT24C02
    201. elif cmd[2] == '0' and cmd[3] == '7':
    202. if cmd[4] == 'g':
    203. try:
    204. message = cmd[5:]
    205. window['AT24C02_O'].update(message)
    206. except:
    207. message = "ERROR"
    208. window['AT24C02_O'].update(message)
    209. print("AT24C02: message ERROR")
    210. elif cmd[4] == 'p':
    211. window['AT24C02_I'].update(value='')
    212. print("AT24C02: write SUCCESS")
    213. else:
    214. message = "ERROR"
    215. window['AT24C02_O'].update(message)
    216. print("AT24C02: message ERROR")
    217. # DAC&&spi
    218. elif cmd[2] == '0' and cmd[3] == '8':
    219. if cmd[4] == 'p':
    220. print("DAC: SUCCESS")
    221. else:
    222. print("DAC: message ERROR")
    223. # 处理事件
    224. def event_handle(window, client_socket):
    225. led = 0
    226. # 事件循环
    227. while True:
    228. try:
    229. cmd_handle(window)
    230. event, values = window.read()
    231. if event == 'input':
    232. window['txbuff'].update(disabled=not values['input'])
    233. elif event == 'send':
    234. send_handle(window, client_socket, values)
    235. elif event == 'Clean':
    236. window['Output'].update(value='')
    237. window['AT24C02_O'].update(value='')
    238. elif event == 'dht11':
    239. window['DHT11_O'].update(value=' ')
    240. set_tx_buf('dht11', 'g')
    241. send_cmd(client_socket)
    242. elif event == 'ds18b20':
    243. window['DS18B20_O'].update(value=' ')
    244. set_tx_buf('ds18b20', 'g')
    245. send_cmd(client_socket)
    246. elif event == 'Quit':
    247. quit_handel(client_socket)
    248. print(f"See you.............")
    249. break
    250. elif event is None:
    251. print(f"xxxxxxxxxxxxxxxxxxxx")
    252. break
    253. elif event == 'LED':
    254. if led % 2 == 0:
    255. set_tx_buf('led','p1')
    256. else:
    257. set_tx_buf('led','p0')
    258. led+=1
    259. if led > 100:
    260. led = 0
    261. send_cmd(client_socket)
    262. elif event == 'SR501':
    263. set_tx_buf('sr501','g')
    264. send_cmd(client_socket)
    265. elif event == 'SR04':
    266. set_tx_buf('sr04','g')
    267. send_cmd(client_socket)
    268. elif event == 'IRDA':
    269. set_tx_buf('irda','g')
    270. send_cmd(client_socket)
    271. elif event == 'MOTOR':
    272. motor_handel(window, client_socket, values)
    273. elif event == 'AT24C02_R':
    274. window['AT24C02_O'].update(value='')
    275. set_tx_buf('AT24C02','g')
    276. send_cmd(client_socket)
    277. elif event == 'AT24C02_W':
    278. global_var.AT24C02_DATA = values['AT24C02_I']
    279. set_tx_buf('AT24C02','p'+global_var.AT24C02_DATA)
    280. print(global_var.TX_BUF)
    281. window['AT24C02_I'].update(value='')
    282. send_cmd(client_socket)
    283. elif event == 'DAC':
    284. set_tx_buf('dac','p'+values['DAC'])
    285. send_cmd(client_socket)
    286. # 处理其他事件...
    287. except Exception as e:
    288. window.close()
    289. print(f"An error occurred: {e}")
    290. return 0
    291. window.close()
    292. return 0
    293. def main():
    294. # 创建GUI对象
    295. window = show.show_window('DefaultNoMoreNagging')
    296. # 尝试连接到服务器
    297. client_socket = tcp.connect_to_server()
    298. if client_socket is not None:
    299. event_handle(window, client_socket)
    300. if __name__ == '__main__':
    301. main()

    3、server编写

    1. case 8:
    2. printf("DAC!!!\n");
    3. if ('p' == cmd[4])
    4. {
    5. direction = direction_put;
    6. get_data = extract_digit_number(cmd, 5, (strlen(&cmd[5])));
    7. if (NOERROR == dac_handle(&get_data))
    8. {
    9. tx_buffer = "@008p";
    10. }
    11. else
    12. {
    13. tx_buffer = "@008e";
    14. }
    15. }
    16. else
    17. {
    18. tx_buffer = "@008e";
    19. }
    20. if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
    21. {
    22. perror("send failed");
    23. }
    24. break;
    25. default:
    26. printf("Unknown equipment!!!\n");

    4、driver_handle

    1. /*
    2. *author : xintianyu
    3. *function : Handle dac Settings
    4. *date : 2024-4-24
    5. -----------------------
    6. author date modify
    7. */
    8. int dac_handle(int *data)
    9. {
    10. /*传入参数后面要做通用处理使用空指针*/
    11. /*路径宏定义*/
    12. char *device = "/dev/cebss_dac";
    13. int ret = NOERROR;
    14. int dac_val = 0;
    15. static int fd;
    16. /* 打开文件 */
    17. fd = open(device, O_RDWR);
    18. if (fd == -1)
    19. {
    20. printf("can not open file %s\n", device);
    21. return ERROR;
    22. }
    23. /*0~1023*/
    24. dac_val = *data*1023/100+1;
    25. printf("dac_val == %d\n", dac_val);
    26. write(fd, &dac_val, 2);
    27. dac_val += 50;
    28. close(fd);
    29. return ret;
    30. }

    5、test

    非常的丝滑。

    6、 项目管理

  • 相关阅读:
    高性价比 ESP32 网络收音机:OLED 显示+编码器控制 (源码开源)
    inner join left join 什么情况效果相同
    深入理解注解驱动配置与XML配置的融合与区别
    剑指offer 38:字符串的排列
    架构设计系列5:如何设计高可用架构
    2022牛客暑期多校训练营(加赛)(EGHJM)
    【SLAM】4李群&李代数
    说一下v-model的理解双向绑定 vue响应式原理
    跨境电商:外贸企业做海外社媒营销的优势
    NAOMI代码详解
  • 原文地址:https://blog.csdn.net/qq_52479948/article/details/138166165