C# 使用Conexant USB CX93010调制解调器从串行端口获取Callerid?

C# 使用Conexant USB CX93010调制解调器从串行端口获取Callerid?,c#,serial-port,modem,C#,Serial Port,Modem,我有一个C#代码,但当我把线路连接到电话时,它不需要从连接到USB端口的拨号调制解调器接收被叫方。它被调用了,但在程序运行和阅读过程中,我并没有听到其他任何声音 这是我的代码: public partial class Form1 : XtraForm { public Form1() { InitializeComponent(); } SerialPort sp ; private void simpleBut

我有一个C#代码,但当我把线路连接到电话时,它不需要从连接到USB端口的拨号调制解调器接收被叫方。它被调用了,但在程序运行和阅读过程中,我并没有听到其他任何声音

这是我的代码:

public partial class Form1 : XtraForm
{
    public Form1()
    {
        InitializeComponent();            
    }

    SerialPort sp ;
    private void simpleButton1_Click(object sender, EventArgs e)
    {            
        sp = new SerialPort(textEdit1.Text);
        sp.NewLine = "\r\n";
        sp.Parity = Parity.None;
        sp.DataBits = 8;
        sp.StopBits = StopBits.One;
        sp.DtrEnable = true;
        sp.WriteBufferSize = 1024;

        sp.Open();
        sp.WriteLine("AT+VCID=1");
        sp.RtsEnable = true;
        timer1.Start();
    }

    void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {

    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        sp.Close();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        memoEdit1.Text += "\n" + sp.ReadExisting();
    }

    private void simpleButton2_Click(object sender, EventArgs e)
    {
        sp.Close();
    }

当调制解调器支持来电显示时,请使用AT+CLIP=1。这将导致在调用调制解调器时显示未经请求的+剪辑消息

+CLIP未经请求的消息通常如下所示:

+CLIP: <number>,<type>,,,,<cli validity>
+剪辑:,,,,,

其中,
是一个字符串,包含的数字格式由
定义<代码>地址八位字节,例如国际号码为145<代码>确定是否保留了该号码等。

Conexant USB CX93010 ACF调制解调器没有FSK协议

根据我对Conexant USB CX93010进行的一些测试,我在下面发布代码。下面的代码是用C(而不是C)编写的,在Linux(而不是Windows)上运行。但它应该为C#计划提供一个良好的基准

该代码基于Sawdust编写的另一个代码,并具有程序的测试结果

您还可以在中找到Conexant调制解调器的全面AT命令集。它可以追溯到2001年,但它的调制解调器AT命令比我在网上其他地方发现的要多


这是代码

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义显示字符串1
int set_接口_属性(int fd,int speed)
{
结构termios tty;
如果(tcgetattr(fd和tty)<0){
printf(“来自tcgetattr的错误:%s\n”,strerror(errno));
返回-1;
}
cfmakeraw&tty;
cfsetospeed(&tty,(速度)速度);
cfsetispeed(速度)和tty(速度);
如果(tcsetattr(fd、TCSANOW和tty)!=0){
printf(“来自tcsetttr的错误:%s\n”,strerror(errno));
返回-1;
}
返回0;
}
void write_命令(int fd,const void*cmd,size_t len)
{
如果(len==~(size\u t)0)
len=strlen((const char*)cmd);
printf(“发送%d:%s\n”,(int)len,(const char*)cmd);
int-wlen=写入(fd、cmd、len);
如果(wlen!=len){
printf(“写入错误:%d,%d\n”,wlen,errno);
}
tcdrain(fd);/*输出延迟*/
}
无效读取响应(int fd)
{
char-buf[256];
int rlen=读取(fd、buf、sizeof(buf)-1);
如果(rlen>0){
#ifdef显示字符串
buf[rlen]=0;
printf(“读取%d:\%s\”\n),rlen,buf);
#else/*显示十六进制*/
无符号字符*p;
printf(“读取%d:,rlen”);
对于(p=buf;rlen-->0;p++)
printf(“0x%x”,*p);
printf(“\n”);
#恩迪夫
}else if(rlen<0){
printf(“读取错误:%d:%s\n”,rlen,strerror(errno));
}else{/*rlen==0*/
printf(“读取超时\n”);
}
}
int main(int argc,char*argv[])
{
int-fd;
常量字符端口名[]=“/dev/ttyACM0”;
fd=打开(端口名,O|U RDWR | O|U NOCTTY | O|U同步);
如果(fd<0){
printf(“打开%s时出错:%s\n”,端口名,strerror(errno));
返回-1;
}
/*波特率115200,8位,无奇偶校验,1停止位*/
设置接口属性(fd,B115200);
写入命令(fd,“ATZ\r”,4);/*重置*/
读取响应(fd);
写入命令(fd,“ATE0\r”,-1);/*回显关闭*/
读取响应(fd);
write_命令(fd,“AT+VCID=?\r”,-1);/*查询*/
读取响应(fd);
write_命令(fd,“AT+CLIP=?\r”,-1);/*查询CallerID caps*/
读取响应(fd);
write_命令(fd,“AT+VCID=1\r”,-1);/*设置CallerID*/
读取响应(fd);
printf(“进入循环,按CTRL+C组合键以断开…\n\n”);
而(1)
{
读取响应(fd);
}
返回0;
}

以下是使用手机的测试结果。我改变了名字和电话号码;另一方面,它是程序的精确输出

$sudo./modem.exe
发送4:ATZ
读6:“
好啊
"
发送5:0
阅读11:“ATE0
好啊
"
发送10:AT+VCID=?
读15:“
(0-2)
好啊
"
发送10:AT+CLIP=?
读9:“
错误
"
发送10:AT+VCID=1
读6:“
好啊
"
进入循环,按CTRL+C组合键可断开。。。
读8:“
戒指
"
读67:“
日期=0214
时间=2116
NMBR=2025551212
姓名=无名氏
"
读8:“
戒指
"
读67:“
日期=0214
时间=2116
NMBR=2025551212
姓名=无名氏
"
读8:“
戒指
"
读8:“
戒指
"
读8:“
戒指
"

此外,您还可以通过+GSR发送
以获取真正的调制解调器版本,而不是Windows提供的版本(这似乎有点不准确):


您的调制解调器是否支持接收来电显示(FSK解码)?我们希望用户发布的代码能够正常工作,演示问题,并且不会出现任何问题。你的代码充满了注释过的代码。首先清理一下。是的,在手册中写着它支持来电显示检测Conexant USB CX93010 ACFModem@Manish-
AT+VCID=?
返回
(0-2)
,因此调制解调器支持CallerID。+VCID=1可能会解决您的问题。为您的调制解调器模块找到AT参考指南总是很好的。它们通常对学习模块专业非常有用。
Send 7: AT+GMR
Read 44: "AT+GMR
+GMR: CX93001-EIS_V0.2013-V92

OK"