5588|16

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

掌上电脑串口接收数据如何实现 [复制链接]

最近在做PC与掌上电脑的串口通讯。
现在能够实现掌上电脑发送数据,PC能够接收到。
而PC发送数据,掌上电脑接收不到。
同样的程序代码,在PC上能够实现发送和接收。
不知原因在哪?
请教!

接收代码如下(C#):
       private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // 读取缓冲区的数据
            string data = ComPort.ReadExisting();
            // 显示读取的数据到数据窗口
            updateReceiveText(data);
        }

      
        public void updateReceiveText(string msg)
        {

            this.textBox1.Invoke(new EventHandler(delegate
                {
                    //this.textBox1.AppendText(msg);
                    this.textBox1.Text = this.textBox1.Text + msg;
                    this.textBox1.ScrollToCaret();
                }));
        }

最新回复

楼主,这个不一定就表明好用;那么多哥们都能用的串口调试助手,到你这里不能用,你却说是软件的原因,这有点儿假,建议检查硬件原因…  详情 回复 发表于 2010-2-1 06:37
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
等我回头给你看看啊,我们刚做完了
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不懂C#
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

4
 
你的掌上电脑使用的是什么操作系统?
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
Windows Mobile 5
我在网上查看了一些网友写的,基本上也是这样,同样的代码我转换到PC上接收都正常。
我设的端口是COM1,不知是否应该设这个端口
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

6
 
这是完整的程序代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace DeviceApplication4
{
    public partial class Form1 : Form
    {
        SerialPort ComPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
        public Form1()
        {
            InitializeComponent();
        }
      

        private void button1_Click(object sender, EventArgs e)
        {
            SendData("1");
            this.label1.Text = "我按了第一个按钮";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            SendData("2");
            this.label1.Text = "我按了第二个按钮";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            SendData("3");
            this.label1.Text = "我按了第三个按钮";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            SendData("4");
            this.label1.Text = "我按了第四个按钮";
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            ComOpen();
            ComPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        }
        //发送数据
        private void SendData(string s)
        {
            if (ComPort.IsOpen == true) ComPort.Close();
            try
            {
                ComPort.Open();
                if (ComPort.IsOpen)//检查串口是否打开
                {

                    // 发送用户的文本到串口
                    ComPort.Write(s);

                }

                else
                {
                    MessageBox.Show("可能串口没有打开!", "提示");
                }
            }
            catch
            {

                MessageBox.Show("出现异常请重新启动程序!", "提示");
            }
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // 读取缓冲区的数据
            string data = ComPort.ReadExisting();
            // 显示读取的数据到数据窗口
            updateReceiveText(data);
        }

      
        public void updateReceiveText(string msg)
        {

            this.textBox1.Invoke(new EventHandler(delegate
                {
                    //this.textBox1.AppendText(msg);
                    this.textBox1.Text = this.textBox1.Text + msg;
                    this.textBox1.ScrollToCaret();
                }));
        }
        private void ComOpen()
        {
            if (ComPort.IsOpen == true) ComPort.Close();

            // 打开串口
            try
            {
                ComPort.Open();
            }
            catch
            {
                MessageBox.Show("没有发现此串口或串口可能被占用!", "提示");
            }


        }

        private void button5_Click(object sender, EventArgs e)
        {
            this.textBox1.Text = " ";
        }
    }
}
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
串口接收程序
/*******************************************************************************************
函数名称: CALLBACK CSerialPortDlg::OnCommRecv
描    述: 串口接收数据成功回调函数
输入参数: 无
输出参数: 无
返    回: FALSE: 失败;    TRUE: 成功
********************************************************************************************/
void CALLBACK CSerialPortDlg::OnCommRecv(CWnd* pWnd, char *buf, int buflen)
{        CString tmp;

        CSerialPortDlg * pDlg = (CSerialPortDlg*)pWnd;
        CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_REC_DISP);
                                                                                                                /* 取得控件指针 */
        for (int i = 0; i < buflen; i++, buf++)
        {
                tmp.Format(_T("%c"), *buf);                                                /* 将字符转换为字符串 */
                pDlg->m_strRecDisp += tmp;
        }

        pRecvStrEdit->SetWindowText(pDlg->m_strRecDisp);        /* 显示在窗口上 */
}
/*******************************************************************************************
函数名称: CSerialPortDlg::CommRecvTread
描    述: 串口接收线程
输入参数: LPVOID lparam: 线程参数,创建线程时传入
输出参数: 无
返    回: 0: 线程退出, 返回值没特殊含义
********************************************************************************************/
DWORD CSerialPortDlg::CommRecvTread(LPVOID lparam)
{
        DWORD dwLength;
        char *recvBuf = new char[1024];
        CSerialPortDlg *pDlg = (CSerialPortDlg*)lparam;

        while(TRUE)
        {                                                                                                                                /* 等待线程退出事件 */
                if (WaitForSingleObject(pDlg->m_ExitThreadEvent, 0) == WAIT_OBJECT_0)
                        break;       

                if (pDlg->m_hComm != INVALID_HANDLE_VALUE)
                {                                                                                                                        /* 从串口读取数据 */
                        BOOL fReadState = ReadFile(pDlg->m_hComm, recvBuf, 1024, &dwLength, NULL);
                        if(!fReadState)
                        {
                                //MessageBox(_T("无法从串口读取数据!"));
                        }
                        else
                        {
                                if(dwLength != 0)
                                        OnCommRecv(pDlg, recvBuf, dwLength);                        /* 接收成功调用回调函数 */
                        }
                }
        }               

        delete[] recvBuf;
        return 0;
}
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢,不是C#,我看的不太懂,但同样谢谢!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
mark,
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 
最近从网上下了装在掌上电脑上的串口调试助手,发现也是只能发出去,接收不到,
现在怀疑是不是串口线坏了,或者串口线不是232的,
串口线是九针的,可能是别的吗?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
mobile 的系统倒没做过,我以前在CE5下用串口+zigbee,做过数据采集和发送
C#的看不太懂,我觉得应该是你的串口有问题。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

12
 
这个啊,用分析仪分析一下就知道答案了.

1、用正确程序收发,记录下数据;
2、用你的程序收发,记录下数据;
一比较,马上发现差异,那就是你要改的地方,简单吧!!!

串口监视分析仪comspy V2.0大众普及版(2010/01/05更新)
http://www.armecos.com/freedown/down.asp?id=17&url=/down/good/comspy-v20.rar

本程序用于串口监视,不占用当前被测串口。
只要Windows系统能枚举出来的串口都可以监视,支持一次同时监视多个串口。

工程师必备工具---串口分析利器!!!

注册费仅¥39,一本书的价格!!!

就当买本书吧!!!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
今天试了一天,大致排除了硬件问题,可能还是软件原因,还没想到办法。
问题是什么是正确的程序,我从网上下载的别的串口调试助手一类的软件,也只能发出去,接收不到,
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

14
 
用示波器看看TXD和RXD上的信号,确认该发送的正确发送出来了。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 12 楼 lsc9908 的回复:
今天试了一天,大致排除了硬件问题,可能还是软件原因,还没想到办法。
问题是什么是正确的程序,我从网上下载的别的串口调试助手一类的软件,也只能发出去,接收不到,


别人能用的串口助手,你这不好用,怎么还能说排除了硬件原因的呢。
串口连线是否正确 232 422 485串口的连线不一样,不是搞错了吧
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

16
 
是厂家自带的串口线
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 lsc9908 的回复:
是厂家自带的串口线
楼主,这个不一定就表明好用;那么多哥们都能用的串口调试助手,到你这里不能用,你却说是软件的原因,这有点儿假,建议检查硬件原因…
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表