C# 控制斑馬條碼打印機打印,初始正常,但進行其他串口通信操作後打印卡死,重啟打印機恢復。這通常是串口協議衝突或端口資源佔用導致。本文分析原因並提供排查方案。
PrintBarCode 正常打印SerialPort 通信操作後WriteFile(Printer.Write)
public bool Write(string Mystring) {
if (iHandle != -1) {
int i;
OVERLAPPED x;
byte[] mybyte = Encoding.Default.GetBytes(Mystring);
return WriteFile(iHandle, mybyte, mybyte.Length, out i, out x); // 卡死在這裡
}
throw new Exception("端口未打開!");
}
WriteFile 阻塞SerialPort 對象嘗試打開同一物理端口Close() 未調用、異常未處理)
serialPort.DiscardOutBuffer();
serialPort.DiscardInBuffer();
WriteTimeout 防止無限阻塞
serialPort.WriteTimeout = 2000; // 2秒
try { printer.Write(cmd); }
catch (TimeoutException) {
// 重新打開端口、重發或報警
printer.Close();
printer.Open();
printer.Write(cmd);
}
public static void PrintBarCode(...) {
// 使用 using 確保資源釋放
using (var printer = new Printer()) {
printer.DevicePath = devicePath;
if (!printer.Open()) return;
// 發送前清空
// 假設 Printer 內部暴露 SerialPort
printer.ClearBuffers();
bool success = printer.Write(cmd.ToString());
if (!success) {
// 記錄日誌、重試邏輯
}
printer.Close();
}
}
若業務允許,將打印機遷移至網絡接口(TCP/IP),完全避免串口衝突:
TcpClient 或 Socket 發送指令