社区
C#
帖子详情
SerialPort.Write出现System.IO.IOException
kolige
2010-04-30 11:46:01
我用SerialPort做了一个串口通讯的程序,今天发现一个奇怪的问题:
在Write出现了一个异常
System.IO.IOException:由于线程退出或应用程序请求,已放弃I/O操作。
我想问问什么情况下会出现这个问题,Write好像没有System.IO.IOException这个异常的啊。
...全文
943
11
打赏
收藏
SerialPort.Write出现System.IO.IOException
我用SerialPort做了一个串口通讯的程序,今天发现一个奇怪的问题: 在Write出现了一个异常 System.IO.IOException:由于线程退出或应用程序请求,已放弃I/O操作。 我想问问什么情况下会出现这个问题,Write好像没有System.IO.IOException这个异常的啊。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yhb71868
2012-09-10
打赏
举报
回复
那么多扯蛋的,害我看半天。
碰到这问题,弄了快两天了,终于找到问题。
共享出来。
找找有没有其他的线程 调用了DiscardInBuffer();DiscardOutBuffer();
kolige
2010-05-03
打赏
举报
回复
如果没有端口,出现的异常是
System.InvalidOperationException:端口被关闭。
System.IO.Ports.SerialPort.Write(Byte[] buffer,Int32 offset,Int32 count)
不是我的
System.IO.IOException:由于线程退出或应用程序请求,已放弃I/O操作。
System.IO.Ports.InternalResources.WinIOError(Int32 errorCode,String str)
System.IO.Ports.SerialStream.EndWrite(IasyncResult asyncResult)
System.IO.Ports.SerialStream.Write(Byte[] array,Int32 offset,Int32 count,Int32 timeout)
System.IO.Ports.SerialPort.Write(Byte[] buffer,Int32 offset,Int32 count)
kolige
2010-05-03
打赏
举报
回复
我的程序中,每隔半小时会重新打开串口。
而这个错误并不是经常出现,我开始也以为是串口没有打开,特意将串口关闭了再发送数据,结果发现这样的异常是System.InvalidOperationException:端口被关闭。
我查MSDN的时候,SerialPort.Write的异常有:
ArgumentNullException
InvalidOperationException
ArgumentOutOfRangeException
ArgumentException
TimeoutException
并没有IOException,我在同一个地方捕捉的异常,但是特意关闭串口后再发数据得到的异常时InvalidOperationException,长时间运行的时候,有可能出现IOException异常。
兔子-顾问
2010-04-30
打赏
举报
回复
1.串口没打开
2.串口驱动错误
3.实际串口突然损坏
第一种可能比较大。
singincloud
2010-04-30
打赏
举报
回复
http://wenda.tianya.cn/wenda/thread?tid=052feec241c48ae8&clk=wttpcts
不知道有没有用,纯帮顶
周药师
2010-04-30
打赏
举报
回复
这个机器没有你这个 端口的串口 或者 串口未打开
kolige
2010-04-30
打赏
举报
回复
不对啊,如果串口没有打开,出现的异常是:
System.InvalidOperationException:端口被关闭。
System.IO.Ports.SerialPort.Write(Byte[] buffer,Int32 offset,Int32 count)
但是我出现的异常是:
System.IO.IOException:由于线程退出或应用程序请求,已放弃I/O操作。
System.IO.Ports.InternalResources.WinIOError(Int32 errorCode,String str)
System.IO.Ports.SerialStream.EndWrite(IasyncResult asyncResult)
System.IO.Ports.SerialStream.Write(Byte[] array,Int32 offset,Int32 count,Int32 timeout)
System.IO.Ports.SerialPort.Write(Byte[] buffer,Int32 offset,Int32 count)
kolige
2010-04-30
打赏
举报
回复
抱歉,我电脑比较慢,我刷新的时候没看到回复、、、
等我回复了,才看到。
我现在就在调试,先谢谢各位了。
苦苦挣扎中
2010-04-30
打赏
举报
回复
write就是对I/O进行操作的,怎么会没有IOException
兔子-顾问
2010-04-30
打赏
举报
回复
被楼主无视了…… T_T
由于线程退出或应用程序请求,已放弃I/O操作。
已经说的很明确了,意思就是串口没打开或被关闭了。我只是99.99%的肯定是这个问题。你怎么不跟踪调试一下呢?
kolige
2010-04-30
打赏
举报
回复
没有人遇到过这个问题吗??
android 串口驱动
android 串口驱动源代码 package android.
se
ria
l
port
; im
port
java.
io
.File; im
port
java.
io
.FileDescriptor; im
port
java.
io
.FileInputStream; im
port
java.
io
.FileOutputStream; im
port
java.
io
.
IO
Except
io
n
; im
port
java.
io
.InputStream; im
port
java.
io
.OutputStream; im
port
android.util.Log; public class
Se
ria
l
Port
{ private static final String TAG = "
Se
ria
l
Port
"; /* * Do not remove or rename the field mFd: it is u
se
d by native method clo
se
(); */ private FileDescriptor mFd; private FileInputStream mFileInputStream; private FileOutputStream mFileOutputStream; public
Se
ria
l
Port
(File device, int baudrate) throws
Se
curityExcept
io
n,
IO
Except
io
n
{ /* Check access permiss
io
n */ if (!device.canRead() || !device.can
Write
()) { try { /* Missing read/
write
permiss
io
n, trying to chmod the file */ Process su; su = Runtime.getRuntime().exec("/system/bin/su"); /*String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";*/ String cmd = "chmod 777 /dev/s3c_
se
ria
l0" + "\n" + "exit\n"; su.getOutputStream().
write
(cmd.getBytes()); if ((su.waitFor() != 0) || !device.canRead() || !device.can
Write
()) { throw new
Se
curityExcept
io
n(); } } catch (Except
io
n e) { e.printStackTrace(); throw new
Se
curityExcept
io
n(); } } mFd = open(device.getAbsolutePath(), baudrate); if (mFd == null) { Log.e(TAG, "native open returns null"); throw new
IO
Except
io
n
(); } mFileInputStream = new FileInputStream(mFd); mFileOutputStream = new FileOutputStream(mFd); } // Getters and
se
tters public InputStream getInputStream() { return mFileInputStream; } public OutputStream getOutputStream() { return mFileOutputStream; } // JNI private native static FileDescriptor open(String path, int baudrate); public native void clo
se
(); static { System.loadLibrary("
se
ria
l_
port
"); } }
java发送短信之AT指令
短信内容的存储类 /*** * CommonSms 短信用于全局变量 */ public class CommonSms{ /** id */ private int id; /**短信内容*/ private String smstext; /**短信发送方*/ private String
se
nder;//短信发送方 /**短信接收发*/ private String recver;//短信接收发 /**时间*/ private Date date; public String getSmstext() { return smstext; } public void
se
tSmstext(String smstext) { this.smstext = smstext; } public Date getDate() { return date; } public void
se
tDate(Date date) { this.date = date; } public int getId() { return id; } public void
se
tId(Integer id) { this.id = id; } public String get
Se
nder() { return
se
nder; } public void
se
t
Se
nder(String
se
nder) { this.
se
nder =
se
nder; } public String getRecver() { return recver; } public void
se
tRecver(String recver) { this.recver = recver; } } 串口操纵实现类 /*** * 串口操纵实现类 */ public class
Port
{ private Comm
Port
Identifier
port
Id; private
Se
ria
l
Port
se
ria
l
Port
; private OutputStream
Write
r out; private InputStreamReader in; private String COMname; private static char symbol1 = 13; public String getCOMname() { return COMname; } public void
se
tCOMname(String mname) { COMname = mname; } public Comm
Port
Identifier get
Port
Id() { return
port
Id; } public void
se
t
Port
Id(Comm
Port
Identifier
port
Id) { this.
port
Id =
port
Id; } public
Se
ria
l
Port
get
Se
ria
l
Port
() { return
se
ria
l
Port
; } public void
se
t
Se
ria
l
Port
(
Se
ria
l
Port
se
ria
l
Port
) { this.
se
ria
l
Port
=
se
ria
l
Port
; } public OutputStream
Write
r getOut() { return out; } public void
se
tOut(OutputStream
Write
r out) { this.out = out; } public InputStreamReader getIn() { return in; } public void
se
tIn(InputStreamReader in) { this.in = in; } public boolean isu
se
d =true; public boolean isIsu
se
d() { return isu
se
d; } public void
se
tIsu
se
d(boolean isu
se
d) { this.isu
se
d = isu
se
d; } /** * 打开com口 * @param
port
Name * @return */ public
Port
(String
port
Name) { try {
port
Id = Comm
Port
Identifier.get
Port
Identifier(
port
Name); if (
port
Id == null) { System.out.println("
port
is null"); } try {
se
ria
l
Port
= (
Se
ria
l
Port
)
port
Id.open(
port
Name,100000); } catch (
Port
InU
se
Except
io
n e) { System.gc(); e.printStackTrace(); } // 下面是得到用于和COM口通讯的输进、输出流。 try { in = new InputStreamReader(
se
ria
l
Port
.getInputStream()); out = new OutputStream
Write
r(
se
ria
l
Port
.getOutputStream()); } catch (
IO
Except
io
n
e) { System.gc(); System.out.println("
IO
Except
io
n
"); } // 下面是初始化COM口的传输参数,如传输速率:9600等。 try {
se
ria
l
Port
.
se
t
Se
ria
l
Port
Params(9600,
Se
ria
l
Port
.DATABITS_8,
Se
ria
l
Port
.STOPBITS_1,
Se
ria
l
Port
.PARITY_NONE);
se
tCOMname(
port
Id.getName());
se
tIsu
se
d(true); } catch (Unsup
port
edCommOperat
io
nExcept
io
n e) { e.printStackTrace(); System.gc(); } } catch (NoSuch
Port
Except
io
n e) { e.printStackTrace(); System.gc(); } } /** * 检查SIM是否存在 * @return */ public boolean chakan
Port
() { try { String atCommand = "AT+ccid"; String strReturn =
se
ndAT(atCommand); if (strReturn.indexOf("OK", 0) != -1) { return true; } return fal
se
; } catch (Except
io
n ex) { System.gc(); ex.printStackTrace(); return fal
se
; } } /** * 封闭COM口 * @return boolean */ public void clo
se
() { try { in.clo
se
(); out.clo
se
(); } catch (
IO
Except
io
n
e) { e.printStackTrace(); }
se
ria
l
Port
.clo
se
(); System.gc();
se
tIsu
se
d(fal
se
); } /** * 向串口中写进字符串命令 * @param s 字符串命令 * @throws Except
io
n 异常 */ public void
write
ln(String s) throws Except
io
n { out.
write
(s); out.
write
('\r'); out.flush(); } /** * 读取COM命令的返回字符串 * @return 结果字符串 * @throws Except
io
n */ public String read() throws Except
io
n { int n, i; char c; String answer = ""; for (i = 0; i < 100; i++) { while (in.ready()) { n = in.read(); if (n != -1) { c = (char) n; answer = answer + c; Thread.sleep(1); } el
se
break; } if (answer.indexOf("OK") != -1) { break; } Thread.sleep(100); } return answer; } /** * 向串口发送AT指令 * @param atcommand 指令内容 * @return 指令返回结果 * @throws java.rmi.RemoteExcept
io
n */ public String
se
ndAT(String atcommand) throws java.rmi.RemoteExcept
io
n { String s = ""; try { Thread.sleep(100);
write
ln(atcommand); Thread.sleep(80); s = read(); Thread.sleep(100); } catch (Except
io
n e) { System.gc(); System.out.println("ERROR:
se
nd AT command failed; " + "Command: " + atcommand + "; Answer: " + s + " " + e); } return s; } } 短信操纵类 /*** * 短信操纵类 */ public class Sms{ private CommonSms commonsms; private static char symbol1 = 13; private static String strReturn = "", atCommand = ""; public boolean
Se
ndSms(
Port
my
port
) { if(!my
port
.isIsu
se
d()) { System.out.println("COM通讯端口未正常打开!"); return fal
se
; }
se
tMessageMode(my
port
,1); // 空格 char symbol2 = 34; // ctrl~z 发送指令 char symbol3 = 26; try { atCommand = "AT+CSMP=17,169,0,08" + String.valueOf(symbol1); strReturn = my
port
.
se
ndAT(atCommand); System.out.println(strReturn); if (strReturn.indexOf("OK", 0) != -1) { atCommand = "AT+CMGS=" + commonsms.getRecver() + String.valueOf(symbol1); strReturn = my
port
.
se
ndAT(atCommand); atCommand = StringUtil.encodeHex(commonsms.getSmstext().trim()) + String.valueOf(symbol3) + String.valueOf(symbol1); strReturn = my
port
.
se
ndAT(atCommand); if (strReturn.indexOf("OK") != -1 && strReturn.indexOf("+CMGS") != -1) { System.out.println("短信发送成功..."); return true; } } } catch (Except
io
n ex) { ex.printStackTrace(); System.out.println("短信发送失败..."); return fal
se
; } System.out.println("短信发送失败..."); return fal
se
; } /** * 设置消息模式 * @param op * 0-pdu 1-text(默认1 文本方式 ) * @return */ public boolean
se
tMessageMode(
Port
my
port
,int op) { try { String atCommand = "AT+CMGF=" + String.valueOf(op) + String.valueOf(symbol1); String strReturn = my
port
.
se
ndAT(atCommand); if (strReturn.indexOf("OK", 0) != -1) { System.out.println("*************文本方式设置成功************"); return true; } return fal
se
; } catch (Except
io
n ex) { ex.printStackTrace(); return fal
se
; } } /** * 读取所有短信 * @return CommonSms集合 */ public List RecvSmsList(
Port
my
port
) { if(!my
port
.isIsu
se
d()) { System.out.println("System Message: COM通讯端口未正常打开!"); return null; } List listMes = new ArrayList(); try { atCommand = "AT+CMGL=\"ALL\""; strReturn = my
port
.
se
ndAT(atCommand); listMes = StringUtil.analy
se
ArraySMS(strReturn); } catch (Except
io
n ex) { ex.printStackTrace(); } return listMes; } /** * 删除短信 * @param index 短信存储的位置 * @return boolean */ public boolean DeleteSMS(int index,
Port
my
port
) { if(!my
port
.isIsu
se
d()){ System.out.println("System Message: COM通讯端口未正常打开!"); return fal
se
; } try { atCommand = "AT+CMGD=" + index; strReturn = my
port
.
se
ndAT(atCommand); if (strReturn.indexOf("OK") != -1) { System.out.println("System Message: 成功删除存储位置为" + index + "的短信......"); } } catch (Except
io
n ex) { ex.printStackTrace(); } return true; } /** * 删除短信中所有短信 * @return boolean */ public boolean DeleteAllSMS(
Port
my
port
) { List list=RecvSmsList(my
port
); boolean ret=true; if(list!=null&&!list.equals("")&&list;.size()>0) { for(int i=0;i
port)) { ret=fal
se
; } } } return ret; } public CommonSms getCommonsms() { return commonsms; } public void
se
tCommonsms(CommonSms commonsms) { this.commonsms = commonsms; } /** * 号码,内容,发送短信息 * @param phone * @param countstring * @throws Except
io
n */ public static void
se
ndmsn(String phone,String countstring){ Sms s = new Sms(); // 发送测试 CommonSms cs=new CommonSms(); cs.
se
tRecver(phone); cs.
se
tSmstext(countstring); s.
se
tCommonsms(cs);
Port
myort=new
Port
("COM7"); s.
Se
ndSms(myort); myort.clo
se
(); } public static void main(String[] args) throws Except
io
n {
se
ndmsn("13265551149","我有一筐的愿看,却等不到一颗流星,闭上眼睛,我看到了我的前途"); } 指令字符串操纵类 /*** * 指令字符串操纵类 */ public class StringUtil { /** * 使用Sms 的RecvSms(int index)的方法时,使用该方法解析MODEM返回的字符串 * 根据MODEM返回的字符串,解析成一个CommonSms对象 * @param str 串口返回的读取短信结果字符串 * @param index 短信索引 * @return */ public static CommonSms analy
se
SMS(String str, int index) { CommonSms commonSms = new CommonSms(); String mesContent; String[] s = str.split("\""); int len = s.length; commonSms.
se
tId(index); mesContent = s[len - 1]; if (mesContent.indexOf("OK") != -1) { mesContent = mesContent.substring(0, mesContent.indexOf("OK")); } mesContent = mesContent.trim(); commonSms.
se
tSmstext(analy
se
Str(mesContent)); // 短信有中文时使用 // mes.
se
tMessage(Unicode2GBK(analy
se
Str(mesContent))); SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd hh:mm:ss"); String datestring = s[len - 2].substring(0, s[len - 2].length() - 3) .replace(',', ' ');// 短信时间格式09/09/09 20:18:01+32 Date date = null; try { date = df.par
se
(datestring); System.out.println(date.toLocaleString()); } catch (Except
io
n ex) { System.out.println(ex.getMessage()); } commonSms.
se
tDate(date); if (s[1].equals("REC READ")) { commonSms.
se
tState("已读"); } el
se
{ commonSms.
se
tState("未读"); } commonSms.
se
t
Se
nder(s[3]); return commonSms; } /** * 使用Sms 的RecvSmsList()方法时,通过该方法解析MODEM返回来的字符串 * 根据MODEM返回的字符串,解析成一个CommonSms的集合对象 * @param str MODEM返回的字符串 * @return */ public static List analy
se
ArraySMS(String str) { List mesList = new ArrayList(); CommonSms cs; String[] messages; String temp; String[] t; if (str.indexOf("CMGL: ") == -1) return null; str = str.substring(0, str.indexOf("OK")).trim(); messages = str.split("\n"); if (messages.length < 2) return null; for (int i = 1; i 5) { cs.
se
tId(Integer.par
se
Int(t[0].trim())); temp = t[1].substring(t[1].indexOf('"') + 1, t[1].lastIndexOf('"')).trim(); if (temp.equals("REC READ")) { cs.
se
tState("已读"); } el
se
{ cs.
se
tState("未读"); } cs.
se
t
Se
nder((t[2].substring(t[2].indexOf('"') + 1, t[2] .lastIndexOf('"')).trim())); SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd hh:mm:ss"); String datestring = t[4].substring(t[4].indexOf('"') + 1) + " " + t[5].substring(0, t[5].indexOf('"'));// 短信时间格式09/09/09 // 20:18:01+32 Date date = null; try { date = df.par
se
(datestring); } catch (Except
io
n ex) { System.out.println(ex.getMessage()); } cs.
se
tDate(date); i++; cs.
se
tSmstext(analy
se
Str(messages[i].trim())); mesList.add(cs); } } return mesList; } /** * 将PDU编码的十六进制字符串 如“4F60597DFF01” 转换成unicode "\u4F60\u597D\uFF01" * @param str 要转化的字符串 * @return 转换后的十六进制字符串 */ public static String analy
se
Str(String str) { StringBuffer sb = new StringBuffer(); if (!(str.length() % 4 == 0)) return str; for (int i = 0; i < str.length(); i++) { if (i == 0 || i % 4 == 0) { sb.append("\\u"); } sb.append(str.charAt(i)); } return Unicode2GBK(sb.toString()); } /** * 将unicode编码 "\u4F60\u597D\uFF01" 转换成中文 "你好!" * @param dataStr 要转化的字符串 * @return 转换后的中文字符串 */ public static String Unicode2GBK(String dataStr) { int index = 0; StringBuffer buffer = new StringBuffer(); while (index < dataStr.length()) { if (!"\\u".equals(dataStr.substring(index, index + 2))) { buffer.append(dataStr.charAt(index)); index++; continue; } String charStr = ""; charStr = dataStr.substring(index + 2, index + 6); char letter = 0; try{letter = (char) Integer.par
se
Int(charStr, 16);}catch (Except
io
n e) {} buffer.append(letter); index += 6; } return buffer.toString(); } /** * 将中文字符串转换成Unicode * @param str 要转换的中文字符串 * @return 转换后的Unicode */ public static String GBK2Unicode(String str) { StringBuffer result = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char chr1 = (char) str.charAt(i); if (!isNeedConvert(chr1)) { result.append(chr1); continue; } try{result.append("\\u" + Integer.toHexString((int) chr1));}catch (Except
io
n e) {} } return result.toString(); } /** * 在中文字符串转换成Unicode方法中判定是否需要转换 * @param para 要转化的字符 * @return boolean */ public static boolean isNeedConvert(char para) { return ((para & (0x00FF)) != para); } /** * 使用Sms 的
Se
ndSms()方法发送短信时,调用此方法将其短信内容转换成十六进制 * @param msg 短信内容 * @return 转换后的十六进制短信 */ public static final String encodeHex(String msg) { byte[] bytes = null; try { bytes = msg.getBytes("GBK"); } catch (java.
io
.Unsup
port
edEncodingExcept
io
n e) { e.printStackTrace(); } StringBuffer buff = new StringBuffer(bytes.length * 4); String b = ""; char a; int n = 0; int m = 0; for (int i = 0; i 0) { buff.append("00"); buff.append(b); n = n + 1; } el
se
{ a = msg.charAt((i - n) / 2 + n); m = a; try{b = Integer.toHexString(m);}catch (Except
io
n e) {} buff.append(b.substring(0, 4)); i = i + 1; } } return buff.toString(); } }
.NET System.
IO
.
Port
s.
Se
ria
l
Port
和kernel32.dll API
作为一名编写桌面软件的嵌入式开发人员,主要用于外围设备的配置和数据下载,我经常使用串行数据流。主要是来自 FTDI的USB 虚拟串行帖子,还有 USB 通信设备类和 PCI 总线上真正的 16550 兼容 UART。由于通过在线仿真器调试接口查看数据通常是一种痛苦的体验,因此与定制 PC 应用程序进行串行数据通信对于分析数据质量和提供有关硬件设计的反馈至关重要。 ...
se
ria
l
io
java_如何解决错误java.
io
.
IO
Except
io
n
:串行通信的nativeavailable输入/输出错误?...
我有Arm处理器,它是AllWinner A13,RAM-512mb和OS-Linaro 13.01 Ubuntu(意思是debian).现在我正在为/ dev / ttyS0制作串行通信程序.我使用netbeans在java中为双向串行通信制作了简单的程序.在我的处理器中,我将ttyS0的rx-tx缩短为环回连接检查.意味着我通过串口发送的东西,我回来了.但我得到错误.我在我的处理器上安装了op...
(六)C#
se
ria
l
Port
Obj.ReadBufferSize必须设置1024的整数倍,不能设置奇怪的整数,否则导致System.
IO
.
IO
Except
io
n
: 数据无效
一、问题 串口缓存器
se
ria
l
Port
Obj.ReadBufferSize = X,X必须是1024整数倍,不然会发生下面的错误。 System.
IO
.
IO
Except
io
n
: 数据无效。 在 System.
IO
.
Port
s.InternalResources.Win
IO
Error(Int32 errorCode, String str) 在 System.
IO
.Po...
C#
110,549
社区成员
642,562
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章