真的很牛逼?。。?!
我只負(fù)責(zé)溝通,寫代碼,改UI都是deepseek弄的。
import serial
import serial.tools.list_ports
import tkinter as tk
from tkinter import ttk, messagebox, colorchooser, filedialog
from threading import Thread, Event
import time
import binascii
from datetime import datetime
class SerialDebugger:
def __init__(self, master):
self.master = master
self.serial_port = None
self.receive_flag = Event()
self.auto_send_flag = False
self.rx_counter = 0
self.tx_counter = 0
self.recv_color = '#FF0000' # 默認(rèn)接收顏色紅色
self.send_color = '#0000FF' # 默認(rèn)發(fā)送顏色藍(lán)色
self.extension_visible = False # 擴(kuò)展窗口可見狀態(tài)
# 獲取默認(rèn)Checkbutton背景顏色
temp = tk.Checkbutton(master)
self.default_bg = temp.cget('bg')
temp.destroy()
# 初始化ttk樣式
self.style = ttk.Style()
self.style.configure('Yellow.TCombobox', fieldbackground='yellow')
# 初始化界面
self.setup_ui()
self.setup_extension_window()
self.update_ports()
# 綁定事件
self.port_combo.bind(">", self.on_port_change)
def setup_ui(self):
"""初始化主界面布局"""
self.master.geometry("990x700")
self.master.title("串口調(diào)試工具 - 智能模擬傳感器答復(fù)")
self.master.minsize(650, 450)
# 配置主窗口網(wǎng)格布局
self.master.grid_columnconfigure(0, weight=1)
self.master.grid_columnconfigure(1, weight=0, minsize=0) # 擴(kuò)展窗口列
self.master.grid_rowconfigure(0, weight=1) # 數(shù)據(jù)顯示區(qū)
self.master.grid_rowconfigure(1, weight=0) # 控制區(qū)
self.master.grid_rowconfigure(2, weight=0) # 狀態(tài)欄
# ========== 數(shù)據(jù)顯示區(qū) ==========
display_frame = ttk.Frame(self.master)
display_frame.grid(row=0, column=0, sticky="nsew", padx=5, pady=5)
self.text_display = tk.Text(display_frame, state=tk.DISABLED, wrap=tk.WORD)
scroll_display = ttk.Scrollbar(display_frame, orient="vertical", command=self.text_display.yview)
self.text_display.configure(yscrollcommand=scroll_display.set)
self.text_display.grid(row=0, column=0, sticky="nsew")
scroll_display.grid(row=0, column=1, sticky="ns")
display_frame.grid_columnconfigure(0, weight=1)
display_frame.grid_rowconfigure(0, weight=1)
# ========== 中間控制區(qū) ==========
control_frame = ttk.Frame(self.master)
control_frame.grid(row=1, column=0, columnspan=2, sticky="nsew", padx=5, pady=2)
control_frame.grid_columnconfigure(0, minsize=200, weight=0)
control_frame.grid_columnconfigure(1, weight=1)
control_frame.grid_columnconfigure(2, minsize=250, weight=0)
control_frame.grid_rowconfigure(0, minsize=155, weight=0)
# 串口設(shè)置區(qū)
self.setup_serial_controls(control_frame)
# 發(fā)送輸入?yún)^(qū)
self.setup_send_controls(control_frame)
# 功能區(qū)
self.setup_function_controls(control_frame)
# ========== 狀態(tài)欄 ==========
self.setup_status_bar()
def setup_extension_window(self):
"""初始化擴(kuò)展窗口"""
self.extension_frame = ttk.Frame(self.master, width=425)
self.extension_frame.grid(row=0, column=1, sticky="nsew")
self.extension_frame.grid_remove()
# 創(chuàng)建Notebook
self.notebook = ttk.Notebook(self.extension_frame)
self.notebook.pack(expand=True, fill='both')
# 預(yù)置命令標(biāo)簽頁
self.preset_frame = ttk.Frame(self.notebook)
self.notebook.add(self.preset_frame, text="預(yù)置命令")
# 自動答復(fù)標(biāo)簽頁
self.auto_reply_frame = ttk.Frame(self.notebook)
self.notebook.add(self.auto_reply_frame, text="自動答復(fù)")
# 設(shè)置固定寬度
self.extension_frame.grid_propagate(False)
self.extension_frame.config(width=425)
def toggle_extension(self):
"""切換擴(kuò)展窗口顯示狀態(tài)"""
self.extension_visible = not self.extension_visible
if self.extension_visible:
self.extension_frame.grid()
self.master.grid_columnconfigure(1, minsize=425, weight=0)
else:
self.extension_frame.grid_remove()
self.master.grid_columnconfigure(1, weight=0, minsize=0)
def setup_status_bar(self):
"""初始化底部狀態(tài)欄"""
status_bar = ttk.Frame(self.master, height=22)
status_bar.grid(row=2, column=0, columnspan=2, sticky="sew")
self.status_conn = ttk.Label(status_bar, text="未連接", anchor=tk.W)
self.status_rx = ttk.Label(status_bar, text="RX:0", width=8)
self.status_tx = ttk.Label(status_bar, text="TX:0", width=8)
self.status_author = ttk.Label(status_bar, text="Power by DeepSeek", anchor=tk.E)
self.status_conn.pack(side=tk.LEFT, fill=tk.X, expand=True)
self.status_rx.pack(side=tk.LEFT, padx=5)
self.status_tx.pack(side=tk.LEFT, padx=5)
self.status_author.pack(side=tk.RIGHT)
def setup_serial_controls(self, parent):
"""串口設(shè)置區(qū)"""
frame = ttk.LabelFrame(parent, text="串口設(shè)置", padding=5)#padding 與頂部的距離
frame.grid(row=0, column=0, sticky="nsew", padx=2)
frame.grid_propagate(False)
frame.config(width=200, height=155)
frame.grid_columnconfigure(1, weight=1)
row = 0
ttk.Label(frame, text="端口號:").grid(row=row, column=0, sticky=tk.W)
self.port_combo = ttk.Combobox(frame)
self.port_combo.grid(row=row, column=1, sticky=tk.EW, padx=6)
row += 1
ttk.Label(frame, text="波特率:").grid(row=row, column=0, sticky=tk.W)
self.baud_combo = ttk.Combobox(frame, values=[
'300', '600', '1200', '2400', '4800', '9600',
'14400', '19200', '38400', '57600', '115200'
])
self.baud_combo.set('9600')
self.baud_combo.grid(row=row, column=1, sticky=tk.EW, padx=6)
row += 1
# 數(shù)據(jù)位和校驗(yàn)行
param_row = ttk.Frame(frame)
param_row.grid(row=row, column=0, columnspan=2, sticky=tk.EW)
ttk.Label(param_row, text="數(shù)據(jù)位:").grid(row=0, column=0, padx=1)
self.data_bits = ttk.Combobox(param_row, values=['5', '6', '7', '8'], width=3)
self.data_bits.set('8')
self.data_bits.grid(row=0, column=1, padx=4)
ttk.Label(param_row, text="校驗(yàn):").grid(row=0, column=2, padx=1)
self.parity = ttk.Combobox(param_row, values=['無', '奇校驗(yàn)', '偶校驗(yàn)'], width=3)
self.parity.set('無')
self.parity.grid(row=0, column=3, sticky=tk.EW)
param_row.grid_columnconfigure(3, weight=1)
row += 1
# 停止位和流控行
param_row = ttk.Frame(frame)
param_row.grid(row=row, column=0, columnspan=2, sticky=tk.EW)
ttk.Label(param_row, text="停止位:").grid(row=0, column=0, padx=1)
self.stop_bits = ttk.Combobox(param_row, values=['1', '1.5', '2'], width=3)
self.stop_bits.set('1')
self.stop_bits.grid(row=0, column=1, padx=4)
ttk.Label(param_row, text="流控:").grid(row=0, column=2, padx=1)
self.flow_control = ttk.Combobox(param_row, values=['無', 'RTS/CTS', 'XON/XOFF'], width=3)
self.flow_control.set('無')
self.flow_control.grid(row=0, column=3, sticky=tk.EW)
param_row.grid_columnconfigure(3, weight=1)
row += 1
self.open_btn = ttk.Button(frame, text="打開端口", command=self.toggle_serial)
self.open_btn.grid(row=row, column=0, columnspan=2, pady=5, sticky=tk.EW)
def setup_send_controls(self, parent):
"""發(fā)送輸入?yún)^(qū)"""
frame = ttk.LabelFrame(parent, text="發(fā)送區(qū)", padding=5)
frame.grid(row=0, column=1, sticky="nsew", padx=2)
frame.grid_propagate(False)
frame.config(height=155)
frame.grid_rowconfigure(0, weight=0)
frame.grid_rowconfigure(1, weight=1)
frame.grid_columnconfigure(0, weight=1)
top_row = ttk.Frame(frame)
top_row.grid(row=0, column=0, sticky="ew", pady=2)
ttk.Button(top_row, text="文件發(fā)送", command=self.send_file).pack(side=tk.LEFT, padx=2)
ttk.Button(top_row, text="數(shù)據(jù)存至文件", command=self.save_data).pack(side=tk.LEFT, padx=2)
ttk.Label(top_row, text="末尾添加校驗(yàn):").pack(side=tk.LEFT)
self.checksum_combo = ttk.Combobox(top_row, values=['None', 'CRC-16', 'XOR'], width=8)
self.checksum_combo.set('None')
self.checksum_combo.pack(side=tk.LEFT, padx=2)
self.checksum_combo.bind(">", self.on_checksum_selected)
self.on_checksum_selected(None)
text_frame = ttk.Frame(frame)
text_frame.grid(row=1, column=0, sticky="nsew")
self.send_text = tk.Text(text_frame, wrap=tk.WORD, font=('Consolas', 10))
scroll_send = ttk.Scrollbar(text_frame, orient="vertical", command=self.send_text.yview)
self.send_text.configure(yscrollcommand=scroll_send.set)
self.send_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scroll_send.pack(side=tk.RIGHT, fill=tk.Y)
def setup_function_controls(self, parent):
"""功能區(qū)"""
frame = ttk.LabelFrame(parent, text="功能設(shè)置", padding=5)
frame.grid(row=0, column=2, sticky="nsew", padx=2)
frame.grid_propagate(False)
frame.config(width=250, height=155)
frame.grid_columnconfigure(0, weight=1)
top_row = ttk.Frame(frame)
top_row.grid(row=0, column=0, sticky="ew", pady=2)
self.hex_send = tk.BooleanVar()
self.hex_send_cb = tk.Checkbutton(top_row, text="Hex發(fā)送", variable=self.hex_send)
self.hex_send_cb.pack(side=tk.LEFT)
self.hex_send.trace_add('write', lambda *args: self.update_checkbutton_bg(self.hex_send_cb, self.hex_send))
self.hex_display = tk.BooleanVar()
self.hex_display_cb = tk.Checkbutton(top_row, text="Hex顯示", variable=self.hex_display)
self.hex_display_cb.pack(side=tk.LEFT, padx=5)
self.hex_display.trace_add('write', lambda *args: self.update_checkbutton_bg(self.hex_display_cb, self.hex_display))
ttk.Button(top_row, text="清空窗口", command=self.clear_display).pack(side=tk.RIGHT)
middle_row = ttk.Frame(frame)
middle_row.grid(row=1, column=0, sticky="ew", pady=2)
self.timestamp = tk.BooleanVar()
self.timestamp_cb = tk.Checkbutton(middle_row, text="時間戳", variable=self.timestamp)
self.timestamp_cb.pack(side=tk.LEFT)
self.timestamp.trace_add('write', lambda *args: self.update_checkbutton_bg(self.timestamp_cb, self.timestamp))
color_frame = ttk.Frame(middle_row)
color_frame.pack(side=tk.RIGHT)
ttk.Label(color_frame, text="收:").pack(side=tk.LEFT)
self.recv_color_lbl = tk.Label(color_frame, width=2, bg=self.recv_color, relief="solid")
self.recv_color_lbl.bind("", lambda e: self.choose_color('recv'))
self.recv_color_lbl.pack(side=tk.LEFT, padx=2)
ttk.Label(color_frame, text="發(fā):").pack(side=tk.LEFT)
self.send_color_lbl = tk.Label(color_frame, width=2, bg=self.send_color, relief="solid")
self.send_color_lbl.bind("", lambda e: self.choose_color('send'))
self.send_color_lbl.pack(side=tk.LEFT, padx=2)
auto_frame = ttk.Frame(frame)
auto_frame.grid(row=2, column=0, sticky="ew", pady=2)
ttk.Label(auto_frame, text="間隔(ms):").pack(side=tk.LEFT)
self.interval_var = ttk.Entry(auto_frame, width=8)
self.interval_var.insert(0, "1000")
self.interval_var.pack(side=tk.LEFT, padx=2)
self.auto_send = tk.BooleanVar()
self.auto_send_cb = tk.Checkbutton(auto_frame, text="自動發(fā)送", variable=self.auto_send, command=self.toggle_auto_send)
self.auto_send_cb.pack(side=tk.LEFT)
self.auto_send.trace_add('write', lambda *args: self.update_checkbutton_bg(self.auto_send_cb, self.auto_send))
# 修改發(fā)送按鈕并添加擴(kuò)展按鈕
button_frame = ttk.Frame(frame)
button_frame.grid(row=3, column=0, sticky="ew", pady=5)
ttk.Button(button_frame, text="發(fā)送", command=self.send_data).pack(side=tk.LEFT, expand=True)
ttk.Button(button_frame, text="擴(kuò)展", command=self.toggle_extension).pack(side=tk.RIGHT)
def choose_color(self, direction):
"""選擇顏色"""
chinese_dir = "接收" if direction == "recv" else "發(fā)送"
color = colorchooser.askcolor(title=f'選擇{chinese_dir}顏色')[1]
if color:
if direction == 'recv':
self.recv_color = color
self.recv_color_lbl.config(bg=color)
else:
self.send_color = color
self.send_color_lbl.config(bg=color)
def update_checkbutton_bg(self, checkbutton, var):
"""更新復(fù)選框背景顏色"""
checkbutton.config(bg='yellow' if var.get() else self.default_bg)
def on_checksum_selected(self, event):
"""校驗(yàn)選項(xiàng)變化事件處理"""
if self.checksum_combo.get() != 'None':
self.checksum_combo.config(style='Yellow.TCombobox')
else:
self.checksum_combo.config(style='TCombobox')
def send_file(self):
"""發(fā)送文件"""
if not self.serial_port or not self.serial_port.is_open:
messagebox.showwarning("警告", "請先打開串口")
return
file_path = filedialog.askopenfilename()
if not file_path: return
try:
with open(file_path, 'rb') as f:
data = f.read()
if self.hex_send.get():
hex_str = data.hex()
data = binascii.unhexlify(hex_str)
data = self.add_checksum(data)
self.serial_port.write(data)
self.tx_counter += len(data)
self.display_data(data, 'send')
self.update_counters()
except Exception as e:
messagebox.showerror("發(fā)送文件錯誤", str(e))
def save_data(self):
"""保存數(shù)據(jù)"""
content = self.text_display.get("1.0", tk.END)
file_path = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")]
)
if not file_path: return
try:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
messagebox.showinfo("保存成功", "數(shù)據(jù)已保存至文件")
except Exception as e:
messagebox.showerror("保存錯誤", str(e))
def add_checksum(self, data):
"""添加校驗(yàn)碼"""
checksum_type = self.checksum_combo.get()
if checksum_type == 'None':
return data
elif checksum_type == 'CRC-16':
crc = self.calculate_crc16(data)
return data + crc
elif checksum_type == 'XOR':
xor = self.calculate_xor(data)
return data + xor.to_bytes(1, 'big')
return data
def calculate_crc16(self, data):
"""計(jì)算CRC16校驗(yàn)"""
crc = 0xFFFF
for byte in data:
crc ^= byte
for _ in range(8):
if crc & 0x0001:
crc >>= 1
crc ^= 0xA001
else:
crc >>= 1
return crc.to_bytes(2, 'little')
def calculate_xor(self, data):
"""計(jì)算異或校驗(yàn)"""
xor = 0
for byte in data:
xor ^= byte
return xor
def update_ports(self):
"""更新端口列表"""
ports = [port.device for port in serial.tools.list_ports.comports()]
self.port_combo['values'] = ports
self.port_combo.set(ports[0] if ports else '')
def update_status(self, status, success=True):
"""更新狀態(tài)欄"""
if success:
conn_info = f"{self.port_combo.get()} | {self.baud_combo.get()}波特 | {self.data_bits.get()}數(shù)據(jù)位 | "
conn_info += f"{self.stop_bits.get()}停止位 | {self.parity.get()} | {self.flow_control.get()}"
self.status_conn.config(text=conn_info, foreground='green')
else:
self.status_conn.config(text=status, foreground='red')
def update_counters(self):
"""更新計(jì)數(shù)器"""
self.status_rx.config(text=f"RX:{self.rx_counter}")
self.status_tx.config(text=f"TX:{self.tx_counter}")
def clear_display(self):
"""清空顯示"""
self.text_display.config(state=tk.NORMAL)
self.text_display.delete(1.0, tk.END)
self.text_display.config(state=tk.DISABLED)
self.rx_counter = self.tx_counter = 0
self.update_counters()
def toggle_auto_send(self):
"""切換自動發(fā)送"""
self.auto_send_flag = self.auto_send.get()
if self.auto_send_flag:
self.auto_send_loop()
def auto_send_loop(self):
"""自動發(fā)送循環(huán)"""
if self.auto_send_flag and self.serial_port.is_open:
self.send_data()
self.master.after(max(100, int(self.interval_var.get())), self.auto_send_loop)
def on_port_change(self, event):
"""端口變更處理"""
if self.serial_port and self.serial_port.is_open:
self.close_serial()
self.open_serial()
def toggle_serial(self):
"""切換串口狀態(tài)"""
if self.serial_port and self.serial_port.is_open:
self.close_serial()
else:
self.open_serial()
def open_serial(self):
"""打開串口"""
try:
params = {
'port': self.port_combo.get(),
'baudrate': int(self.baud_combo.get()),
'bytesize': int(self.data_bits.get()),
'stopbits': {'1':1, '1.5':1.5, '2':2}[self.stop_bits.get()],
'parity': {'無':'N', '奇校驗(yàn)':'O', '偶校驗(yàn)':'E'}[self.parity.get()],
'xonxoff': 1 if self.flow_control.get() == 'XON/XOFF' else 0,
'rtscts': 1 if self.flow_control.get() == 'RTS/CTS' else 0
}
self.serial_port = serial.Serial(**params)
self.open_btn.config(text="關(guān)閉端口")
self.update_status("", True)
self.receive_flag.set()
Thread(target=self.receive_data, daemon=True).start()
except Exception as e:
self.update_status(f"連接失?。簕str(e)}", False)
def close_serial(self):
"""關(guān)閉串口"""
self.receive_flag.clear()
if self.serial_port:
self.serial_port.close()
self.open_btn.config(text="打開端口")
self.status_conn.config(text="未連接", foreground='black')
def receive_data(self):
"""接收數(shù)據(jù)"""
while self.receive_flag.is_set():
try:
if self.serial_port.in_waiting:
data = self.serial_port.read(self.serial_port.in_waiting)
self.rx_counter += len(data)
self.display_data(data, 'recv')
self.update_counters()
time.sleep(0.01)
except Exception as e:
print("接收錯誤:", e)
break
def send_data(self):
"""發(fā)送數(shù)據(jù)"""
if not (self.serial_port and self.serial_port.is_open):
messagebox.showwarning("警告", "請先打開串口")
return
text = self.send_text.get("1.0", tk.END).strip()
if not text: return
try:
if self.hex_send.get():
hex_str = text.replace(' ', '').replace('n', '')
data = binascii.unhexlify(hex_str)
else:
data = text.encode('utf-8')
data = self.add_checksum(data)
self.serial_port.write(data)
self.tx_counter += len(data)
self.display_data(data, 'send')
self.update_counters()
except Exception as e:
messagebox.showerror("發(fā)送錯誤", str(e))
def display_data(self, data, direction):
"""顯示數(shù)據(jù)"""
prefix = "收←◆ " if direction == 'recv' else "發(fā)→◇ "
color = self.send_color if direction == 'send' else self.recv_color
if self.hex_display.get():
display = ' '.join(f'{b:02X}' for b in data)
else:
try: display = data.decode('utf-8', 'replace')
except: display = str(data)
if self.timestamp.get():
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
full_text = f"[{timestamp}] {prefix}{display}"
else:
full_text = f"{prefix}{display}"
self.text_display.config(state=tk.NORMAL)
self.text_display.insert(tk.END, full_text + 'n', (color,))
self.text_display.tag_config(color, foreground=color)
self.text_display.see(tk.END)
self.text_display.config(state=tk.DISABLED)
if __name__ == "__main__":
root = tk.Tk()
app = SerialDebugger(root)
root.mainloop()
審核編輯 黃宇>>
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
代碼
+關(guān)注
關(guān)注
30文章
4975瀏覽量
74314 -
串口調(diào)試
+關(guān)注
關(guān)注
2文章
275瀏覽量
25669 -
DeepSeek
+關(guān)注
關(guān)注
2文章
837瀏覽量
3381
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
百度騰訊搶灘布局!DeepSeek-R1升級和開源背后,國產(chǎn)AI的逆襲之路
電子發(fā)燒友網(wǎng)報道(文/李彎彎)日前,DeepSeek官方宣布DeepSeek-R1模型已完成小版本試升級,當(dāng)前版本為DeepSeek-R1-0528。次日,DeepSeek-R1-05
SEGGER Ozone調(diào)試器支持第三方調(diào)試工具
SEGGER強(qiáng)大的Ozone調(diào)試器和性能分析器,長期以來一直深受J-Link和J-Trace用戶的信任,現(xiàn)在可以支持第三方調(diào)試工具了。
【干貨分享】RT-Trace國產(chǎn)調(diào)試工具 | 技術(shù)集結(jié)
專為嵌入式開發(fā)者打造的一款高性能、多功能的調(diào)試工具。它集成了實(shí)時系統(tǒng)跟蹤、數(shù)據(jù)監(jiān)控、GDB遠(yuǎn)程調(diào)試、Flash程序燒錄、虛擬終端等多種功能于
DeepSeek R1 MTP在TensorRT-LLM中的實(shí)現(xiàn)與優(yōu)化
TensorRT-LLM 在 NVIDIA Blackwell GPU 上創(chuàng)下了 DeepSeek-R1 推理性能的世界紀(jì)錄,Multi-Token Prediction (MTP) 實(shí)現(xiàn)了大幅提速
速看!EASY-EAI教你離線部署Deepseek R1大模型
1.Deepseek簡介DeepSeek-R1,是幻方量化旗下AI公司深度求索(DeepSeek)研發(fā)的推理模型。DeepSeek-R1采用強(qiáng)化學(xué)習(xí)進(jìn)行后訓(xùn)練,旨在提升推理能力,尤其擅
【「DeepSeek 核心技術(shù)揭秘」閱讀體驗(yàn)】--全書概覽
講解Deepseek的使用方法
第三章 深入剖析Deepseek-V3的模型架構(gòu)、訓(xùn)練框架、推理階段優(yōu)化、后訓(xùn)練優(yōu)化等關(guān)鍵技術(shù)
第四章關(guān)于DeepSeek-R1的技術(shù)剖析
第五章 從宏觀角度分析
發(fā)表于 07-21 00:04
【「DeepSeek 核心技術(shù)揭秘」閱讀體驗(yàn)】書籍介紹+第一章讀后心得
的焦點(diǎn)集中在一家來自中國的初創(chuàng)公司——杭州深度求索人工智能基礎(chǔ)技術(shù)研究有限公司(DeepSeek)。這家公司憑借其推出的DeepSeek-V3和DeepSeek-R1兩款產(chǎn)品,在行業(yè)內(nèi)
發(fā)表于 07-17 11:59
調(diào)試工具:Eclipse調(diào)試工具欄與窗口的深入分析
摘要 :在嵌入式系統(tǒng)開發(fā)領(lǐng)域,高效的調(diào)試工具鏈對于項(xiàng)目的成功實(shí)施具有決定性意義。本文聚焦于 Eclipse 調(diào)試工具欄與窗口的功能特性,深入剖析其在嵌入式開發(fā)調(diào)試過程中的關(guān)鍵作用。以廈
Arm Neoverse N2平臺實(shí)現(xiàn)DeepSeek-R1滿血版部署
頗具優(yōu)勢。Arm 攜手合作伙伴,在 Arm Neoverse N2 平臺上使用開源推理框架 llama.cpp 實(shí)現(xiàn) DeepSeek-R1 滿血版的部署,目前已可提供線上服務(wù)。
NVIDIA Blackwell GPU優(yōu)化DeepSeek-R1性能 打破DeepSeek-R1在最小延遲場景中的性能紀(jì)錄
本文將探討 NVIDIA TensorRT-LLM 如何基于 8 個 NVIDIA Blackwell GPU 的配置,打破 DeepSeek-R1 在最小延遲場景中的性能紀(jì)錄:在 GTC 2025
RT-Trace調(diào)試工具正式發(fā)布!
5月20日,RT-Thread官方預(yù)售了首款調(diào)試工具RT-Trace,獲得了開發(fā)者及企業(yè)用戶的廣泛關(guān)注與支持。RT-Trace調(diào)試工具結(jié)束預(yù)售階段,即日起正式發(fā)布!RT-Trace是一款專為
【書籍評測活動NO.62】一本書讀懂 DeepSeek 全家桶核心技術(shù):DeepSeek 核心技術(shù)揭秘
2025年年初,DeepSeek 成為全球人工智能(AI)領(lǐng)域的焦點(diǎn),其DeepSeek-V3 和DeepSeek-R1 版本在行業(yè)內(nèi)引發(fā)了結(jié)構(gòu)性震動。
DeepSeek-V3 是
發(fā)表于 06-09 14:38
DeepSeek開源新版R1 媲美OpenAI o3
DeepSeek“悄悄”地又放了一個大招,DeepSeek開源了R1最新0528版本。盡管DeepSee
SAP實(shí)施專家解答:如何用DeepSeek-R1實(shí)現(xiàn)需求溝通效率倍增
工博科技分享AI工具鏈在IT項(xiàng)目中的深度應(yīng)用:通過DeepSeek-R1實(shí)現(xiàn)智能會議記錄結(jié)構(gòu)化(2小時會議5分鐘生成決策表)和精準(zhǔn)多語言文檔翻譯(錯誤率降低14%),幫助IT團(tuán)隊(duì)將重復(fù)性工作耗時減少
【幸狐Omni3576邊緣計(jì)算套件試用體驗(yàn)】CPU部署DeekSeek-R1模型(1B和7B)
,使用如下命令:
ollama pull deepseek-r1:1.5b
拉取deepseek-r1 1.5b模型,過程中會下載速度和進(jìn)度:
稍等一段時間,下載完成:
2.4 ollama運(yùn)行模型
發(fā)表于 04-21 00:39
用deepseek-R1寫了一個串口調(diào)試工具,500行代碼,功能強(qiáng)大!
評論