串口访问EPSON TMU220打印机无返回数据

独醒子 2019-01-02 05:39:30
我串口代码应该没问题,访问其他硬件都用过。发送数据接收数据都没问题

关于这个针式带切刀的微型打印机,我这里只使用两个指令:

A:打印一个字符串指令,打印机直接有打印动作,无返回数据;
B:获取打印机品牌,返回“_EPSON”

情况如下:
1、使用串口助手操作,无任何问题,两条指令都能正常执行;
2、使用代码操作,A正常,B无效,且执行B后,再次执行A也无效,断开重连串口后,任何指令也无反应;
3、使用“虚拟串口(COM1<=>COM2)”,代码发送给串口助手检查,指令无误;
4、使用串口助手模拟打印机发送返回指令,代码是能正确获取到;
5、用代码按以下顺序执行:打开串口--A--B--A--关闭串口--打开串口--A--关闭串口,此时打印机能进行第一次的A指令打印,之后无反应,可在此之后,使用串口助手连接打印机串口,当打开串口的时候,串口助手获得了打印机反馈的B指令反馈数据,并且执行了之前代码的后两次A指令的打印动作;

这是怎么回事,代码就是无法获取打印机的返回数据,并且一旦发送有返回数据的指令后,打印机能接收到这些指令,但无任何返回也无任何动作,哪怕代码关闭串口再次连接也没反应。此时若用串口助手连接打印机,不发送任何数据,也能获得之前代码发送指令的返回数据并且执行之前代码发送的那些打印动作。

求教大神指点。
...全文
586 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
独醒子 2019-01-07
  • 打赏
  • 举报
回复
问题已解决,是在串口打开前设置某一属性。是串口供电问题,有谁知道这个属性设置项,发上来接分。我过段时间结贴
独醒子 2019-01-03
  • 打赏
  • 举报
回复
好吧 我把代码整理下发上来,没用的都删除,接收数据处理代码不做具体处理,只设置个断点,但截不到:


private SerialPort com = new SerialPort();

private void Form1_Load(object sender, EventArgs e)
{
com.PortName = "COM8";
com.BaudRate = 115200;
com.DataBits = 8;
com.StopBits = StopBits.One;
com.Parity = Parity.None;
com.ReadTimeout = 3000;
com.WriteTimeout = 3000;
OpenCOM();
}
//按钮事件 关闭串口
private void button7_Click(object sender, EventArgs e)
{
CloseCOM();
}
//按钮事件 打印机打印个字符串 这个指令打印机正常打印
private void button8_Click(object sender, EventArgs e)
{
cmd_PrintStrAndReturn("abc123");
}
//按钮事件 发送查询指令 打印机无返回,且执行过再执行打印也无效,但指令在打印机缓冲中,使用串口助手连接后按序执行
private void button9_Click(object sender, EventArgs e)
{
cmd_GetCJ();
}

// 打开端口
public bool OpenCOM()
{
bool retValue = true;
try
{
if (!com.IsOpen)
{
com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);
com.Open();
}
}
catch { retValue = false; }
return retValue;
}

// 接收事件 (具体处理代码包括防死锁及数据处理全删除,只做断点调试)
void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] _data = new byte[com.BytesToRead];
com.Read(_data, 0, _data.Length);
}


// 关闭端口
public bool CloseCOM()
{
bool retValue = true;
try
{
if (com.IsOpen) com.Close();
}
catch { retValue = false; }
return retValue;
}

// 发送串口数据
public bool SendData(byte[] bData)
{
bool retValue = true;
try
{
com.Write(bData, 0, bData.Length);
}
catch { retValue = false; }
return retValue;
}

// 获取打印机厂家(此指令打印机串口应该会返回个字符串“_EPSON”)
public bool cmd_GetCJ()
{
byte[] bMsgTrue = new byte[4];
bMsgTrue[0] = 0x1D;
bMsgTrue[1] = 0x49;
bMsgTrue[2] = 0x42;
return SendData(bMsgTrue);
}
// 打印字符串并换行
public bool cmd_PrintStrAndReturn(string _str)
{
try
{
cmd_PrintChinese(_str);
cmd_PrintAndReturn();
return true;
}
catch { return false; }
}

// 打印字符串
public bool cmd_PrintChinese(string _str)
{
try
{
byte[] bytes = Encoding.Default.GetBytes(_str);
SendData(bytes);
return true;
}
catch { return false; }
}

// 打印并换行LF
public bool cmd_PrintAndReturn()
{
byte[] bMsgTrue = new byte[1];
bMsgTrue[0] = 0x0A;
return SendData(bMsgTrue);
}
独醒子 2019-01-03
  • 打赏
  • 举报
回复
这段代码访问别的串口硬件 收发均无问题,为何连接这个打印机,一旦发送有返回数据的指令就没效果了,关键是,代码关闭串口后,使用串口一连接,则之前包括那条带返回数据的指令,以及这条指令后发送的其他指令,就正确按顺序执行了,且也正确获得返回数据了,就像这些指令缓存在打印机里等待串口助手程序连接后执行一样。。。
  • 打赏
  • 举报
回复
就是你的串口代码的问题呗。还“没问题”啊?
独醒子 2019-01-03
  • 打赏
  • 举报
回复
没人了解么?

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧