急啊!非常急!真的很急!! ( 积分: 50 )

  • 主题发起人 主题发起人 赛特
  • 开始时间 开始时间

赛特

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在做毕业设计,是电话语音服务系统。
用的是TW8VID的语音卡,它提供的DLL文件里面有:TV_GETDTMFCHAR(通道号)函数,返回的是用户电话输入的字符的ASC码。但是在实现时总是不行。这块语音卡有两个通道,所以我是设计用两个线程来分别完成,把获取ASC码的操作放在线程里面的,不会是因为放在线程里就不行吧?
线程的代码:
procedure tongdao_f.Execute;
begin
{ Place thread code here }
while 1<2do
begin
if cs[0]=s_laidian then
begin
tv_hangupctrl(0);

cs[0]:=s_greet;
end;

if cs[0]=s_greet then
// 欢迎词状态
begin
tv_offhookctrl(0);

if tv_startplayfile(0,'voice/welcome.TW',0,0)<0 then
//播放欢迎词
begin
cs[0]:=s_laidian;
continue;
end
else
begin

cs[0]:=s_inputid;
end;
end;

if cs[0]=s_inputid then
// 输入学号状态
begin
if tv_startplayfile(0,'voice/INPUTIS.TW',0,0)<0 then
begin
cs[0]:=s_inputid;
continue;
end
else
begin

id_f:='';
//string 类型 用来接收用户输入
tv_flushdtmf(0);
//清空接收缓冲区
while tv_getdtmfchar(0)<>35do
//可以很顺利的执行到这里,说明上面是
begin
//没问题的,就是这while循环不对,指教
case tv_getdtmfchar(0) of
48:id_f:=id_f+'0';
49:id_f:=id_f+'1';
50:id_f:=id_f+'2';
51:id_f:=id_f+'3';
52:id_f:=id_f+'4';
53:id_f:=id_f+'5';
54:id_f:=id_f+'6';
55:id_f:=id_f+'7';
56:id_f:=id_f+'8';
57:id_f:=id_f+'9';
else
end;
end;

cs[0]:=s_inputpwd;
//在这里设置断点看id_f的值总是不对,为什么呢?
end;
end;
end;
end;
 
小弟在做毕业设计,是电话语音服务系统。
用的是TW8VID的语音卡,它提供的DLL文件里面有:TV_GETDTMFCHAR(通道号)函数,返回的是用户电话输入的字符的ASC码。但是在实现时总是不行。这块语音卡有两个通道,所以我是设计用两个线程来分别完成,把获取ASC码的操作放在线程里面的,不会是因为放在线程里就不行吧?
线程的代码:
procedure tongdao_f.Execute;
begin
{ Place thread code here }
while 1<2do
begin
if cs[0]=s_laidian then
begin
tv_hangupctrl(0);

cs[0]:=s_greet;
end;

if cs[0]=s_greet then
// 欢迎词状态
begin
tv_offhookctrl(0);

if tv_startplayfile(0,'voice/welcome.TW',0,0)<0 then
//播放欢迎词
begin
cs[0]:=s_laidian;
continue;
end
else
begin

cs[0]:=s_inputid;
end;
end;

if cs[0]=s_inputid then
// 输入学号状态
begin
if tv_startplayfile(0,'voice/INPUTIS.TW',0,0)<0 then
begin
cs[0]:=s_inputid;
continue;
end
else
begin

id_f:='';
//string 类型 用来接收用户输入
tv_flushdtmf(0);
//清空接收缓冲区
while tv_getdtmfchar(0)<>35do
//可以很顺利的执行到这里,说明上面是
begin
//没问题的,就是这while循环不对,指教
case tv_getdtmfchar(0) of
48:id_f:=id_f+'0';
49:id_f:=id_f+'1';
50:id_f:=id_f+'2';
51:id_f:=id_f+'3';
52:id_f:=id_f+'4';
53:id_f:=id_f+'5';
54:id_f:=id_f+'6';
55:id_f:=id_f+'7';
56:id_f:=id_f+'8';
57:id_f:=id_f+'9';
else
end;
end;

cs[0]:=s_inputpwd;
//在这里设置断点看id_f的值总是不对,为什么呢?
end;
end;
end;
end;
 
cs[0]表示0号通道的状态
 
while tv_getdtmfchar(0)<>35do
//可以很顺利的执行到这里,说明上面是
begin
//没问题的,就是这while循环不对,指教
case tv_getdtmfchar(0) of
没明白,为啥循环判断用tv_getdtmfchar,循环体内还用tv_getdtmfchar呢?
 
我也用过五岳馨的tw8vid,他们有示例程序的,你上面的代码我没有看明白。
 
最外面那个while 1<2 是让它一直监听;里面那个while TV_GETDTMFCHAR(0)<>35 是说如果用户输入的不是'#'就记录到string类型的id_f里面(用户的输入以#号结束的)
 
我做的是个查询成绩的语音服务系统,现在由于在第一次需要用户输入时就遇到了问题,代码只是写到了要求用户输入查询学号的地方。
示例程序我看过了,都没有用户输入这块,没有用到过TV_GETDTMFCHAR()函数
 
to fphuang:
我真觉得产品的质量是不是有问题,真不知道为什么总是接收不到正确的用户输入!晕!
 
id_f:='';
//string 类型 用来接收用户输入
tv_flushdtmf(0);
//清空接收缓冲区
while tv_getdtmfchar(0)<>35do
//可以很顺利的执行到这里,说明上面是
begin
//没问题的,就是这while循环不对,指教
----------------------------------------------------------------------------
那說明上面那句有問題,即:
tv_flushdtmf(0);
//清空接收缓冲区
具體我沒有語音卡,做不了測試
 
怎么会和tv_flushdtmf(0)有关系呢?我把这句不要试过的,也不行??而且我在上面说的那里设置断点测试时还有这种情况:用户输入1234#23#才跳出来,正常的应该是1234#就跳出来撒。觉得在接收输入时有问题
 
这也是我第一次接触线程,像我在线程里面用while 1<2的死循环方法让它一直运行,要结束该线程是不是就只能强制结束的方式了?像我做的电话语音服务系统,要在线程里面一直监听通道只能是死循环方式吧,还有别的解决方案吗?
//。。。。。。。。。。。。
***线程的脾气太难掌握了,呵呵,不好意思!有感而发!
 
用过这种语音卡的能给点意见吗????
 
while not terminalteddo
begin
end;
 
我觉得就是内循环的问题。改成下面的试试。
while truedo

begin

case tv_getdtmfchar(0) of
48:id_f:=id_f+'0';
49:id_f:=id_f+'1';
50:id_f:=id_f+'2';
51:id_f:=id_f+'3';
52:id_f:=id_f+'4';
53:id_f:=id_f+'5';
54:id_f:=id_f+'6';
55:id_f:=id_f+'7';
56:id_f:=id_f+'8';
57:id_f:=id_f+'9';
35:break;
else
end;
end;
 
to flamboyant:
太感谢了,改成你写的就行了,为什么不能就在while的条件里说明什么时候跳出循环呢?怎么会有这种情况哟?呵呵!!!!!!……
顺便问一下Synchronize(),里面的过程是不是不能有参数哟?比如:
Synchronize(xianshi('你好'));想在主窗体上显示&quot;你好&quot;,编译都不能通过?
 
你去书店买本书,书名《串口通信技术与工程实践》人民邮电出版社 49元,里面有个电话语音服务源程序,还有光盘;足够你看的了!
 
那本书我有,它的那个电话语音系统是用控件做的,没意思!
 
to flamboyant:
太感谢了,改成你写的就行了,为什么不能就在while的条件里说明什么时候跳出循环呢?怎么会有这种情况哟?呵呵!!!!!!……
顺便问一下Synchronize(),里面的过程是不是不能有参数哟?比如:
Synchronize(xianshi('你好'));想在主窗体上显示&quot;你好&quot;,编译都不能通过?
 
while tv_getdtmfchar(0)<>35do
//可以很顺利的执行到这里,说明上面是
begin
//没问题的,就是这while循环不对,指教
case tv_getdtmfchar(0) of
写的话,在循环条件判断的时候调用了一次tv_getdtmfchar,case判断的时候又调用了一次tv_getdtmfchar,就是说,一次循环读了两次用户输入。当然会出错
 
Synchronize(Method: TThreadMethod);
type TThreadMethod = procedure of object;
TThreadMethod is a class method with no parameters and no return value.
 
后退
顶部