我的计算机连着一个modem,在超级终端中向串口输入“at”,返回“ok”,我在程序里也向达到这这样的效果,可是不行啊,输入什么指令,就从端口返回什么指令,比如说输入“at”,就返回“at”,我用的类是c#2005的SerialPort类,下面是我的代码,谁能说说怎么回事,在线等,马上给分。public partial class Form1 : Form
{
private SerialPort sp = null;
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
try
{
sp = new SerialPort("COM1");
sp.ReadTimeout = 5000;
sp.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void button2_Click(object sender, EventArgs e)
{
try
{
sp.Write(textBox1.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void button3_Click(object sender, EventArgs e)
{
try
{
/*string text=null;
char[] buffer = new char[10];
sp.Read(buffer,0,6);
for (int i = 0; i < buffer.Length; i++)
{
text += buffer[i];
}
textBox2.Text = text;*/
/*string text = null;
char t = (char)sp.ReadChar();
text+=t.ToString();
while (true)
{
t = (char)sp.ReadChar();
if (t == '\0') break;
else text += t.ToString();
}
textBox2.Text = text;*/ string text = null;
byte[] t = new byte[20];
char[] c = new char[20];
sp.Read(t, 0, t.Length);
sp.Read(t, 0, t.Length);
c = Encoding.ASCII.GetChars(t);
int i;
for (i = 0; i < c.Length; i++)
{
if (c[i] == 'O' || c[i] == 'K')
text += c[i].ToString();
}
textBox2.Text = text;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
{
private SerialPort sp = null;
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
try
{
sp = new SerialPort("COM1");
sp.ReadTimeout = 5000;
sp.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void button2_Click(object sender, EventArgs e)
{
try
{
sp.Write(textBox1.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void button3_Click(object sender, EventArgs e)
{
try
{
/*string text=null;
char[] buffer = new char[10];
sp.Read(buffer,0,6);
for (int i = 0; i < buffer.Length; i++)
{
text += buffer[i];
}
textBox2.Text = text;*/
/*string text = null;
char t = (char)sp.ReadChar();
text+=t.ToString();
while (true)
{
t = (char)sp.ReadChar();
if (t == '\0') break;
else text += t.ToString();
}
textBox2.Text = text;*/ string text = null;
byte[] t = new byte[20];
char[] c = new char[20];
sp.Read(t, 0, t.Length);
sp.Read(t, 0, t.Length);
c = Encoding.ASCII.GetChars(t);
int i;
for (i = 0; i < c.Length; i++)
{
if (c[i] == 'O' || c[i] == 'K')
text += c[i].ToString();
}
textBox2.Text = text;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
解决方案 »
- MFC——一个音乐播放器的删除一首歌曲的功能错误情况
- explorer.exe和userinit.exe是分别是由哪个进程启动的
- 哥哥姐姐们帮帮忙
- select函数是否不支持多线程(不好意思,没分了,不然应该给100分的)
- 一个关于socket的奇怪问题,请进,有分!!!在线等,谢谢
- 传递给ActiveX控件的消息被一个叫AfxOleControl42的家伙截获到了,右键菜单弹不出来,怎么办????
- 谁知道 《 硬盘保护技术手册》 这一本书在哪里可以下载?
- 谁有MapInfo安装软件,送100分!
- 一个mfc的dll为什么不能进入OnIdle呢??
- 求一个遍历查找文件的算法程序
- COleDateTime的Format的问题
- 我现在想关闭原来的那个对话框,应该怎么实现?
{
try
{
sp = new SerialPort("COM1");
sp.ReadTimeout = 5000;
sp.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
-------------------------------------
感觉这个地方打开串口简单了些,波特率、停止位什么的都没设置(也可能我不了解这个类)
我用API函数操作串口需要这样设置://打开串口
int OpenComm(char *DeviceName)
{
hCom = CreateFile(DeviceName, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); //创建串口,异步方式
if (hCom == INVALID_HANDLE_VALUE)
return -1; //打开串口失败
else
{
SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY ); //设置串口事件
SetupComm( hCom, 4096,4096); //设置读写缓冲区大小
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
memset(&Write_OS,0,sizeof(OVERLAPPED));
memset(&Read_OS,0,sizeof(OVERLAPPED));
memset(&OS,0,sizeof(OVERLAPPED));
COMMTIMEOUTS comTimeOut; //设置超时
comTimeOut.ReadIntervalTimeout = MAXDWORD;
comTimeOut.ReadTotalTimeoutMultiplier = 3000;
comTimeOut.ReadTotalTimeoutConstant = 200;
comTimeOut.WriteTotalTimeoutMultiplier = 300;
comTimeOut.WriteTotalTimeoutConstant = 200;
SetCommTimeouts(hCom,&comTimeOut);
Read_OS.Internal = 0;
Read_OS.InternalHigh = 0;
Read_OS.Offset = 0;
Read_OS.OffsetHigh = 0; //设置结构
Write_OS.Internal = 0;
Write_OS.InternalHigh = 0;
Write_OS.Offset = 0;
Write_OS.OffsetHigh = 0; //设置结构 Read_OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
Write_OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
DCB dcb;
GetCommState(hCom, &dcb ); //串口设置
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fBinary = TRUE;
dcb.fParity = FALSE;
SetCommState( hCom, &dcb );
DWORD dwThreadId, dwThrdParam = 1;
hReadThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TheardEvent, &dwThrdParam, 0, &dwThreadId); //运行串口监视线程
return 0;
}
}
{
try
{
sp = new SerialPort("COM1");
sp.ReadTimeout = 5000;
sp.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
-------------------------------------
楼主试了么?我没用过这个类。估计应该有:
sp.SetBaudRate, sp.BaudRate 等设置函数或变量,用来设置波特率等,你试试看。
我上边这一段
DCB dcb;
GetCommState(hCom, &dcb ); //串口设置
dcb.BaudRate = 9600; // 波特率9600
dcb.ByteSize = 8; //数据位
dcb.Parity = NOPARITY; //奇偶校验
dcb.StopBits = ONESTOPBIT; //停止位
dcb.fBinary = TRUE;
dcb.fParity = FALSE;
SetCommState( hCom, &dcb );
就是设置的。
你用的超级终端不是也得设置这些吗?
AT
返回的是:
ATOK
(注意:在AT和OK间有四位数据用来换行和控制光标)
所以在处理的时候应该注意。